2013-08-30 2 views
0

두 개의 검색 디스플레이를 하나의보기 컨트롤러 (iPad)에 배치하고 싶습니다. 내 View Controller에 두 개의 Search Display Controller를 드래그하지만 한 개의 검색 디스플레이 만 작동합니다.두 가지 검색 검색 디스플레이를 만드는 방법

Connections Inspector에서 한 검색 디스플레이의 콘센트 "searchDisplayController"가 "Search Display Controller"에 연결되어 있지만 다른 하나는이 연결을 가지고 있지 않습니다. 제 생각에 단 하나의 검색 디스플레이 만 작동하는 것 같습니다.

제 질문은 : 하나의보기 컨트롤러에서 두 개의 검색 디스플레이를 어떻게 사용할 수 있습니까? 내 방법 : 검색 디스플레이 컨트롤러 두 개를 드래그하면 올바르지 않을 수 있습니다.

추신. 다음 검색 코드를 사용하여 어떤 검색 표시가 포커스가 맞는지 확인합니다.

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

답변

1

항상 스토리 보드에서는 작동하지 않지만 검색 디스플레이 2 개를 프로그래밍 방식으로 구현하면 작동합니다. 여기에 내 코드를 올리십시오 :

- (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는 두 개의 막대를 하나의 컨트롤러에 연결할 수 없게합니다. 이 코드에서 무슨 일이 벌어지고 있는지 이해한다면 컨트롤러의 대리자와 데이터 소스를 모두 설정하여 IB가 만들 수없는 것을 성취 할 수 있습니다. iOS8에서 UISearchDisplayController가 사용되지 않으므로 수정 내용을 알 수 없습니다. –

+0

아이디어는 telSearchEditing 및 addressSearchEditing (bool) 상태를 사용하여 'shouldReloadTableForSearchString'대리자 메서드에 검색 디스플레이가 활성화되었음을 알리는 것입니다. telSearchEditing 및 addressSearchEditing의 상태는 searchBarShouldBeginEditing에 정의됩니다. 희망은 당신에게 도움이됩니다. – beaumelon

관련 문제