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