Warum wird nicht mein UISearchDisplayController Feuer der Methode didSelectRowAtIndexPath?

Ich bin mit einer ungeraden problem bei der Suche in einem UITableView mit einem UISearchDisplayController. Die UITableViewController eine Unterklasse einer anderen UITableViewController mit einer funktionierenden Methode didSelectRowAtIndexPath. Ohne suchen im Steuergerät übernimmt die Auswahl in Ordnung, die Zusendung der Oberklasse ein didSelectRowAtIndexPath nennen, aber wenn ich wählen Sie eine Zelle bei der Suche der Superklasse erhält nichts, aber die Zelle ist markiert. Unten ist der code von meinem Unterklasse.

@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
  • Rufen Sie mich verrückt, aber ich kann nicht finden, Ihre Methode didSelectRowAtIndexPath in diesem Codebeispiel...?
InformationsquelleAutor MadMod | 2010-05-13
Schreibe einen Kommentar