UITableView проблема поиска панели - PullRequest
0 голосов
/ 18 марта 2012

У меня есть табличное представление и строка поиска в нем.Кажется, я правильно написал код, но когда я что-то ввожу в строку поиска, результаты не отображаются (даже если они должны быть).

@interface PlaylistViewController : UITableViewController 
<UITableViewDelegate,UITableViewDataSource, UISearchBarDelegate>


@property (strong, nonatomic) Playlist* playlistTab;
@property (strong, nonatomic) IBOutlet UITableView *tableView;
@property (weak, nonatomic) IBOutlet UISearchBar *searchBar;
@property (strong, nonatomic) NSMutableArray *displayItems;

@end


@implementation PlaylistViewController 
@synthesize searchBar = _searchBar;
@synthesize tableView = _tableView;
@synthesize playlistTab = _playlistTab;
@synthesize displayItems = _displayItems;

- (void)viewDidLoad
{
    [super viewDidLoad];

    AppDelegate *appDel = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    [self setPlaylistTab:appDel.playlist];
    _displayItems = _playlistTab.collection;
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [_displayItems count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"songCell"];
    Song* song = [_displayItems objectAtIndex:indexPath.row];
    cell.textLabel.text = song.title;
    cell.detailTextLabel.text = song.artist;

    return cell;
}

-(void) searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{
    if ([searchText length]==0) {
        [_displayItems removeAllObjects];
        [_displayItems addObjectsFromArray:_playlistTab.collection];
    } else {
        [_displayItems removeAllObjects];
        for (Song *song in _playlistTab.collection) {
            NSRange rangeTitle = [song.title rangeOfString:searchText     options:NSCaseInsensitiveSearch];
            // NSRange rangeArtist = [song.artist rangeOfString:searchText options:NSCaseInsensitiveSearch];
            if (rangeTitle.location != NSNotFound) {
                [_displayItems addObject:song];
            }
        }
    }

    [self.tableView reloadData];
}

Что мне нужно сделать, чтобы получитьэто работает правильно?

Ответы [ 2 ]

1 голос
/ 18 марта 2012

Похоже, это будет работать, но подход значительно отличается от того, что Apple предлагает .Я предлагаю вам изменить несколько вещей:

1) Создать модель результатов поиска.Это так же, как ваши _displayItems, но содержит подмножество из них, соответствующих поиску.

@property (strong, nonatomic) NSMutableArray *searchResultDisplayItems;

2) Реализация - (BOOL) searchDisplayController: (UISearchDisplayController *) контроллер долженReloadTableForSearchString: (NSString *) searchString.Выполните поиск там:

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
    [searchResultDisplayItems removeAllObjects];
    // now we don't have to throw away the model all the time
    for (Song *song in _playlistTab.collection) {
        // and so on, your search code as you wrote it,
        // but when you find a match...
        [self.self.searchResultDisplayItems addObject:song];
    }
    return YES;
    // no need to explicitly reload data now.
    // answer YES and the search vc will do it for you
}

3) Когда таблица запрашивает счет, решите, какую модель использовать, исходя из того, какая таблица запрашивает

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // it's less typing to ask if tableView == self.tableView, but for clarity,
    // I'll ask the converse question about which table we're using

    if (tableView == self.searchDisplayController.searchResultsTableView) {
        return [self.self.searchResultDisplayItems count];
    } else {
        return [self.displayItems count];
    }
}

4) Когда таблица запрашиваетдля ячейки определите, какую модель использовать, исходя из того, какая таблица запрашивает:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"songCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    NSMutableArray * myModel = (tableView == self.searchDisplayController.searchResultsTableView)? self.searchResultDisplayItems : self.displayItems;
    Song* song = [myModel objectAtIndex:indexPath.row];
    cell.textLabel.text = song.title;
    cell.detailTextLabel.text = song.artist;

    return cell;
}
1 голос
/ 18 марта 2012

Хотя это почти то же самое, попробуйте это тоже

 for(int i=0;i<[_playlistTab.collection count];i++){
      NSLog(@"entered here 1");
      Song *song = (Song *)[_playlistTab.collection objectAtIndex:i];
      NSRange rangeTitle = [song.title rangeOfString:searchText     options:NSCaseInsensitiveSearch];
      NSLog(@"%@",rangeTitle);
      if(rangeTitle.length != 0) {
          NSLog(@"entered here 2");
          [_displayItems addObject:song];
      }
}
...