Попытка получить 'Панель поиска и Контроллер отображения', чтобы снова заполнить табличное представление - PullRequest
0 голосов
/ 20 марта 2012

Я пытаюсь настроить функцию «Панель поиска и контроллер отображения» для работы в приложении для iOS. Я могу NSLog в ответ на поисковый запрос и жесткий код в новом массиве, но я не могу получить табличное представление для повторного заполнения. У меня есть следующее для ответа пользователя на кнопку поиска:

- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar{
  NSLog(@"You clicked the search bar");
  NSMutableArray *filteredResults=[[NSMutableArray alloc] init];

  Person *filteredPerson=[[Person alloc] init];
  filteredPerson.firstName=@"Josie - here i am";
  [filteredResults addObject:filteredPerson];
  _objects=filteredResults;
  self.tableView.dataSource = _objects;
  [self.tableView reloadData];
}

Буду признателен за любые идеи по созданию этого заселения.

ТНХ

edit # 1 Похоже, что это заполняет _objects NSMutableArray:

- (void)insertNewObject:(id)sender
{
    if (!_objects) {
        _objects = [[NSMutableArray alloc] init];
    }
    [_objects insertObject:[NSDate date] atIndex:0];
    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
    [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
}

Должен ли я просто создать новый _objects и использовать insertNewObject вместо кода addObject, который у меня есть выше? Будет ли это обходить необходимость иметь дело со свойством dataSource табличного представления?

редактировать 2 за @ йен

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

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

    /*
    NSDate *object = [_objects objectAtIndex:indexPath.row];
    cell.textLabel.text = [object description];
    */

    Person *rowPerson = [_objects objectAtIndex:indexPath.row];
    cell.textLabel.text = [rowPerson firstName];

    return cell;
}

1020 * ТНХ *

Ответы [ 2 ]

0 голосов
/ 20 марта 2012

У меня есть UITableView, который использует NSMutableArray для хранения данных.Вот как это работает: установите делегат UISearchDisplayController на свой контроллер TableView, и когда вызываются методы UITableViewDelegate (numberOfRows, numberOfSections, cellForRowAtIndexPath и т. Д.), Вы можете выполнить следующие действия для обработки данных поиска, когда это необходимо:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    NSInteger numberOfRows = 0;

    if (tableView == self.searchDisplayController.searchResultsTableView)
    {
        //This is your search table --- use the filteredListContent (this is the NSMutableArray)
        numberOfRows = [filteredListContent count];
    }
    else
    {
        //Serve up data for your regular UITableView here.
    }

    return numberOfRows;
}

Вам следует ознакомиться с документацией UISearchDisplayDelegate .Вы можете использовать эти методы для обновления массива FilterListContent следующим образом:

#pragma mark -
#pragma mark Content Filtering

- (void)filterContentForSearchText:(NSString*)searchText
{   
    //In this method, you'll want to update your filteredListContent array using the string of text that the user has typed in. For example, you could do something like this (it all depends on how you're storing and retrieving the data):

    NSPredicate *notePredicate = [NSPredicate predicateWithFormat:@"text contains[cd] %@", searchText];
    self.filteredListContent = [[mainDataArray filteredArrayUsingPredicate:notePredicate] mutableCopy];
    }


#pragma mark UISearchDisplayController Delegate Methods
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
    [self filterContentForSearchText:searchString];

    // Return YES to cause the search result table view to be reloaded.
    return YES;
}
0 голосов
/ 20 марта 2012

Строка self.tableView.dataSource = _objects; устанавливает ваш массив в качестве источника данных для UITableView.Я предполагаю, что у вас нет подкласса NSArray, который реализует протокол UITableViewDataSource?

Попробуйте удалить эту строку и позволить существующему обработчику источника данных справиться с изменением данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...