gpt4 book ai didi

iphone - 为什么我的 UISearchDisplayController 不会触发 didSelectRowAtIndexPath 方法?

转载 作者:搜寻专家 更新时间:2023-10-30 19:50:49 24 4
gpt4 key购买 nike

我在使用 UISearchDisplayController 搜索 UITableView 时遇到了一个奇怪的问题。 UITableViewController 是另一个 UITableViewController 的子类,具有有效的 didSelectRowAtIndexPath 方法。如果不搜索, Controller 会很好地处理选择,向父类(super class)发送一个 didSelectRowAtIndexPath 调用,但是如果我在搜索父类(super class)时选择一个单元格,除了突出显示该单元格外,什么也接收不到。下面是我的子类的代码。

@implementation AdvancedViewController


@synthesize searchDisplayController, dict, filteredList;


- (void)viewDidLoad {
[super viewDidLoad];

// Programmatically set up search bar
UISearchBar *mySearchBar = [[UISearchBar alloc] init];
mySearchBar.delegate = self;
[mySearchBar setAutocapitalizationType:UITextAutocapitalizationTypeNone];
[mySearchBar sizeToFit];
self.tableView.tableHeaderView = mySearchBar;

// Programmatically set up search display controller
searchDisplayController = [[UISearchDisplayController alloc] initWithSearchBar:mySearchBar contentsController:self];
[self setSearchDisplayController:searchDisplayController];
[searchDisplayController setDelegate:self];
[searchDisplayController setSearchResultsDataSource:self];

// Parse data from server
NSData * jsonData = [NSData dataWithContentsOfURL:[NSURL URLWithString:url]];
NSArray * items = [[NSArray alloc] initWithArray:[[CJSONDeserializer deserializer] deserializeAsArray:jsonData error:nil]];

// Init variables
dict = [[NSMutableDictionary alloc] init];
listIndex = [[NSMutableArray alloc] init];
fullList = [[NSMutableArray alloc] init];
filteredList = [[NSMutableArray alloc] init];

// Get each item and format it for the UI
for(NSMutableArray * item in items) {
// Get the first letter
NSString * firstKey = [[[item objectAtIndex:0] substringWithRange:NSMakeRange(0,1)] uppercaseString];

// Put symbols and numbers in the same section
if ([[firstKey stringByTrimmingCharactersInSet:[[NSCharacterSet letterCharacterSet] invertedSet]] isEqualToString:@""]) firstKey = @"#";

// If there isn't a section with this key
if (![listIndex containsObject:firstKey]) {
// Add the key to the index for faster access (because it's already sorted)
[listIndex addObject:firstKey];
// Add the key to the unordered dictionary
[dict setObject:[NSMutableArray array] forKey:firstKey];
}
// Add the object to the dictionary
[[dict objectForKey:firstKey] addObject:[[NSMutableDictionary alloc] initWithObjects:item forKeys:[NSArray arrayWithObjects:@"name", @"url", nil]]];
// Add the object to the list for simple searching
[fullList addObject:[[NSMutableDictionary alloc] initWithObjects:item forKeys:[NSArray arrayWithObjects:@"name", @"url", nil]]];
}

filteredList = [NSMutableArray arrayWithCapacity:[fullList count]];
}


#pragma mark -
#pragma mark Table view data source

// Custom method for object oriented data access
- (NSString *)tableView:(UITableView *)tableView dataForRowAtIndexPath:(NSIndexPath *)indexPath withKey:(NSString *)key {
return (NSString *)((tableView == self.searchDisplayController.searchResultsTableView) ?
[[filteredList objectAtIndex:indexPath.row] objectForKey:key] :
[[[dict objectForKey:[listIndex objectAtIndex:indexPath.section]] objectAtIndex:indexPath.row] valueForKey:key]);
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return (tableView == self.searchDisplayController.searchResultsTableView) ? 1 : (([listIndex count] > 0) ? [[dict allKeys] count] : 1);
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return (tableView == self.searchDisplayController.searchResultsTableView) ? [filteredList count] : [[dict objectForKey:[listIndex objectAtIndex:section]] count];
}

- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView {
return (tableView == self.searchDisplayController.searchResultsTableView) ? [[NSArray alloc] initWithObjects:nil] : listIndex;
}

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
return (tableView == self.searchDisplayController.searchResultsTableView) ? @"" : [listIndex objectAtIndex:section];
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *kCellID = @"cellID";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellID];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kCellID] autorelease];
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
}

NSString * name = nil;

// TODO: Make dataForRowAtIndexPath work here
if (tableView == self.searchDisplayController.searchResultsTableView) {
// NOTE: dataForRowAtIndexPath causes this to crash for some unknown reason. Maybe it is called before viewDidLoad and has no data?
name = [[filteredList objectAtIndex:indexPath.row] objectForKey:@"name"];
} else {
// This always works
name = [self tableView:[self tableView] dataForRowAtIndexPath:indexPath withKey:@"name"];
}

cell.textLabel.text = name;

return cell;
}


#pragma mark Search Methods


- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope {
// Clear the filtered array
[self.filteredList removeAllObjects];

// Filter the array
for (NSDictionary *item in fullList) {
// Compare the item's name to the search text
NSComparisonResult result = [[item objectForKey:@"name"] compare:searchText options:(NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch) range:NSMakeRange(0, [searchText length])];
if (result == NSOrderedSame) {
// Add to the filtered array if it matches
[self.filteredList addObject:item];
}
}
}


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

// Return YES to cause the search result table view to be reloaded.
return YES;
}


- (void)viewDidUnload { filteredList = nil; }


@end

最佳答案

我遇到了同样的问题,我和你犯了同样的错误。忘记添加 searchResultsDelegate。我的问题通过更改如下代码解决:

添加

[searchDisplayController setSearchResultsDelegate:self];

下面

[searchDisplayController setDelegate:self];
[searchDisplayController setSearchResultsDataSource:self];

关于iphone - 为什么我的 UISearchDisplayController 不会触发 didSelectRowAtIndexPath 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2824202/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com