2

UISearchDisplayController는 iOS 8.0에서 더 이상 사용되지 않지만 새로운 UISearchController 주변에는 많은 좋은 설명서가 없으므로 이전 버전을 대신 사용했습니다. 나와 맺어 라.Searchbar 및 SearchDisplayController의 필터링 된 결과에서 여러 테이블 행을 선택하려면 어떻게해야합니까?

지금은 XIB 파일을 사용하고 있습니다. 나는 정기적 인 tableview를 위해 XIB 내부로 가서 "Selection"아래의 드롭 다운에서 Multiple Selection을 선택하여 여러 셀을 선택할 수 있음을 알고있다.

그러나 UISearchBar의 필터링 된 검색 결과에서 어떻게 가능합니까? 나는 기술적으로, 기본적으로 두개의 테이블 뷰가 분리되어 있음을 이해합니다.

이 시나리오에서는 (필터를 사용하지 않을 때) 일반 tableview에서 다중 셀 선택을 사용할 수 있지만 filter-tableview에서는 그렇게 할 수 없습니다. 내가 일반 테이블 뷰에 대해 한 것은 XIB에서 "다중 선택"을 허용하는 것입니다. filter-tableview에 대해 그렇게하는 방법을 모른다.

다음은 내 tableview 및 검색 창을 구축하는 모든 관련 코드입니다.

#pragma mark Search Bar Methods 

- (void)filterContentForSearchText:(NSString*)searchText scope: (NSString *) scope 
{ 
    NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"firstName BEGINSWITH[c] %@", searchText]; 
    self.searchResults = [[self.tbContactsGrabber.savedArrayOfContactsWithPhoneNumbers filteredArrayUsingPredicate:resultPredicate]mutableCopy]; 
} 


- (BOOL) searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString { 
    [self filterContentForSearchText:searchString scope:[[self.searchDisplayController.searchBar scopeButtonTitles]objectAtIndex:[self.searchDisplayController.searchBar selectedScopeButtonIndex]]]; 

    return YES; 
} 

- (void)searchDisplayController:(UISearchDisplayController *)controller didHideSearchResultsTableView:(UITableView *)tableView { 
    [tableView reloadData]; 
    [self.tableView reloadData]; //these two lines make sure that both Filterview and Tableview data are refreshed - without it, it doesn't work 

} 



#pragma mark Tableview Delegate Methods 
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
    return 1; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 

    if (tableView == self.searchDisplayController.searchResultsTableView) { 
     return [self.searchResults count]; 
    } 
    else { 
     return (self.tbContactsGrabber.savedArrayOfContactsWithPhoneNumbers.count); 
    } 
} 


- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"]; 

    if(!cell){ 
     cell = 
     [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"]; 
    } 

    Contact *selectedContact; 
    if (tableView == self.searchDisplayController.searchResultsTableView){ 
    //if we are in filter search results view 
     selectedContact = [self.searchResults objectAtIndex:indexPath.row]; 
     if (selectedContact.checkmarkFlag == YES) { 
      cell.accessoryType = UITableViewCellAccessoryCheckmark; 
     } 
     else if (selectedContact.checkmarkFlag == NO) { 
      cell.accessoryType = UITableViewCellAccessoryNone; 
     } 
    } 
    else { 
    //if we are in regular table view 
     selectedContact = [self.tbContactsGrabber.savedArrayOfContactsWithPhoneNumbers objectAtIndex:indexPath.row]; 
     if (selectedContact.checkmarkFlag == YES) { 
      cell.accessoryType = UITableViewCellAccessoryCheckmark; 
     } 
     else if (selectedContact.checkmarkFlag == NO) { 
      cell.accessoryType = UITableViewCellAccessoryNone; 
     } 
    } 

    cell.selectionStyle = UITableViewCellSelectionStyleNone; 
    //to make sure there's no gray highlighting when it's clicked - important 

    NSString *fullName = [NSString stringWithFormat:@"%@ %@", selectedContact.firstName, selectedContact.lastName]; 
    cell.textLabel.text = fullName; 
    return cell; 
} 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 
    Contact *selectedContact; 

    //if its filterview mode 
    if (tableView == self.searchDisplayController.searchResultsTableView){ 

     selectedContact = [self.searchResults objectAtIndex:indexPath.row]; 
      if (selectedContact.checkmarkFlag == YES) { 
      selectedContact.checkmarkFlag = NO; 
      cell.accessoryType = UITableViewCellAccessoryNone; 
      [self.selectedContacts removeObject:selectedContact]; 
     } 
     else { 
      selectedContact.checkmarkFlag = YES; 
      cell.accessoryType = UITableViewCellAccessoryCheckmark; 
      [self.selectedContacts addObject:selectedContact]; 
     } 
    } 

    //if its just regular tableview mode, and you selected something 
    else { 
     selectedContact = [self.tbContactsGrabber.savedArrayOfContactsWithPhoneNumbers objectAtIndex:indexPath.row]; 
     selectedContact.checkmarkFlag = YES; 
     cell.accessoryType = UITableViewCellAccessoryCheckmark; 
     [self.selectedContacts addObject:selectedContact]; 
    } 

    NSLog(self.selectedContacts.description); 
} 


- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath { 
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 
    Contact *selectedContact; 
    selectedContact = [self.tbContactsGrabber.savedArrayOfContactsWithPhoneNumbers objectAtIndex:indexPath.row]; 
    selectedContact.checkmarkFlag = NO; 
    cell.accessoryType = UITableViewCellAccessoryNone; 
    [self.selectedContacts removeObject:selectedContact]; 

    NSLog(self.selectedContacts.description); 
} 

답변

0

나는이 이전에 UITableViewController with UISearchDisplayController multiple selection sync

나는이 질문은 위의 링크 된 질문의 중복 의심 대답했다.

+0

감사합니다.하지만 그 질문은 조금 다른 것 같습니다. 나는 이미 "동기화"부분을 작동 시켰습니다. 예를 들어 "일반"테이블 뷰에서 여러 행을 선택하면 "필터"테이블 뷰에 체크 표시가 선택된 것으로 나타납니다. 그러나 내가 가지고있는 구체적인 문제는 실제로 더 작은 범위입니다 ... 나는 "필터"tableview에서 여러 행을 선택할 수 있기를 원하지만 "일반"tableview에서만 할 수 있습니다. –

3

와우, 놀라운 솔루션입니다. 이 위치를 viewDidLoad 또는 원하는 위치에 넣기 만하면됩니다.

self.searchDisplayController.searchResultsTableView.allowsMultipleSelection = YES; 

필터 테이블 뷰를 사용하면 여러 항목을 선택할 수 있습니다.

+0

iOS 8에서는 reloadData 이전에 allowsMultipleSelection을 설정하고 있습니다. [여기 코드] (http://pastie.org/10022152) – arh