2013-08-30 50 views
0

我想在一個視圖控制器(iPad)中放置兩個搜索顯示。我在視圖控制器中拖動兩個搜索顯示控制器,但是,只有一個搜索顯示工作。如何創建兩個搜索顯示IPAD

在Connections Inspector中,我發現一個搜索顯示的出口「searchDisplayController」已連接到「Search Display Controller」,但另一個沒有此連接。我認爲這就是爲什麼只有一個搜索顯示工作。

我的問題是:我們如何在一個視圖控制器中使用兩個搜索顯示? 我想我的方法:拖動兩個搜索顯示控制器可能不正確。

PS。我使用下面的代碼來確定搜索顯示的重點。

- (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar { 
    if (searchBar == self.customerTelSearchBar) { 
     telSearchEditing = YES; 
     addressSearchEditing = NO; 
    }else if(searchBar == self.addressSearchBar){ 
     telSearchEditing = NO; 
     addressSearchEditing = YES; 
    }  
    return YES; 
} 

回答

1

總是不能與故事板一起工作,但是當我使用兩個搜索顯示的程序化實現時,它可以工作。我在這裏發佈我的代碼:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    // Init customerSearchDisplayController 
    self.customerTelSearchBar.delegate = self; 
    customerSearchDisplayController = [[UISearchDisplayController alloc] initWithSearchBar:self.customerTelSearchBar contentsController:self]; 
    customerSearchDisplayController.delegate = self; 
    customerSearchDisplayController.searchResultsDataSource = self; 
    customerSearchDisplayController.searchResultsDelegate = self; 
    // Init addressSearchDisplayController 
    self.addressSearchBar.delegate = self; 
    addressSearchDisplayController = [[UISearchDisplayController alloc] initWithSearchBar:self.addressSearchBar contentsController:self]; 
    addressSearchDisplayController.delegate = self; 
    addressSearchDisplayController.searchResultsDataSource = self; 
    addressSearchDisplayController.searchResultsDelegate = self; 
    // SearchBar status 
    telSearchEditing = NO; 
    addressSearchEditing = NO; 
} 

-(void)filterTelForSearchText:(NSString*)searchText { 
    [filtredCustomersArray removeAllObjects]; 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF.tel contains[c] %@",searchText]; 
    filtredCustomersArray = [NSMutableArray arrayWithArray:[allCustomersArray filteredArrayUsingPredicate:predicate]]; 
} 

-(void)filterAddressForSearchText:(NSString*)searchText { 
    [filtredAddressArray removeAllObjects]; 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF.address contains[c] %@",searchText]; 
    filtredAddressArray = [NSMutableArray arrayWithArray:[allAddressArray filteredArrayUsingPredicate:predicate]]; 
} 

-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString { 
    if (telSearchEditing) { 
     [self filterTelForSearchText:searchString]; 
    }else if (addressSearchEditing){ 
     [self filterAddressForSearchText:searchString]; 
    } 
     return YES; 
} 

- (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar { 
    if (searchBar == self.customerTelSearchBar) { 
     telSearchEditing = YES; 
     addressSearchEditing = NO; 
    }else if(searchBar == self.addressSearchBar){ 
     telSearchEditing = NO; 
     addressSearchEditing = YES; 
    } 
    return YES; 
} 
+0

只需添加一些細節......這正是我需要和爲我工作的。我有不同的肖像和風景桌布局,因此有2個搜索欄。也許有一種方法可以在父VC中共享搜索欄,但我無法讓它工作。而IB阻止您將兩個條連接到一個控制器。如果我理解這段代碼中發生了什麼,通過將兩個控制器的委託和數據源都設置爲self,即可完成IB無法構建的內容。 我看到UISearchDisplayController在iOS8中已棄用,所以不確定修改是什麼。 –

+0

這個想法是使用telSearchEditing和addressSearchEditing(bool)的狀態來告訴委託方法'shouldReloadTableForSearchString'哪個搜索顯示被激活。在searchBarShouldBeginEditing中定義telSearchEditing和addressSearchEditing的狀態。希望對你有幫助。 – beaumelon