uitableview reloadData проблема - PullRequest
1 голос
/ 31 марта 2010

Я отлаживал приложение для iphone и нашел что-то интересное.

У меня есть UIViewControllers с TabBarcontroller (6 вкладок). Каждая вкладка является UIViewController и имеет UITtableview. ViewDidLoad работает и приносит исходные данные. На UITableView есть панель поиска. После того, как пользователь нажимает кнопку поиска, происходит какое-то волшебство, и я получаю массив с данными. Я не могу видеть новые данные в табличном представлении, и [tableView reloadData] не имеет никакого эффекта вне viewDidLoad (первый раз).

Я вижу массив, содержащий данные, и для dataSource установлено значение self. Пока нет отображения данных!

, поэтому я попытался [self.tableView reloadData] & [self.tableView setNeedsDisplay]

Достаточно забавно, новые данные не отображаются. Однако, если я переместлю таблицу вверх или вниз, будет запущен cellForRowAtIndexPath, и в первой строке отобразятся данные.

Может кто-нибудь пролить свет на эту тайну ???

если есть [экран обновления для self.view] ??

-(void) viewWillAppear:(BOOL)animated{
    [self.tableView reloadData];
    [super viewWillAppear:animated];    
}

- (void) searchBarSearchButtonClicked:(UISearchBar *)searchBar2 {   
    [self searchForFullNames];
        //NSAssert(tableView, @"Whoops, tableView is Null");
    [tableView reloadData];
        // hide keyboard
    [searchBar2 resignFirstResponder];
}
- (void)viewDidLoad {

    NSString *path = [[NSBundle mainBundle] pathForResource:@"search" ofType:@"plist"];
    NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithContentsOfFile:path];  
    self.names = dict;
    [dict release];
    NSArray *array = [[names allKeys] sortedArrayUsingSelector:@selector(compare:)];
    self.keys = array;
    isSearchOn = NO;
    canSelectRow = NO;

    self.tableView.scrollEnabled = NO;

    [super viewDidLoad];
}



- (void) searchForFullNames {

    self.listData = nil;
    self.names = nil;
    self.keys = nil;

    NSMutableDictionary *dict = [[NSMutableDictionary alloc]  init];
    NSMutableArray *person = [[NSMutableArray alloc] init];

    [person addObject:@"Doe, John"];
    [person addObject:@"11234"];    
    [person addObject:@"11/22/75"]; 

    [dict setObject:person forKey:@"Person 1"];

    person = [[NSMutableArray alloc] init];

    [person addObject:@"Doe, Mary"];
    [person addObject:@"4321"]; 
    [person addObject:@"11/22/85"]; 

    [dict setObject:person forKey:@"Person 2"];

    person = [[NSMutableArray alloc] init];

    [person addObject:@"Doe, John"];
    [person addObject:@"336655"];   
    [person addObject:@"10/22/84"]; 

    [dict setObject:person forKey:@"Person 3"];

    self.names = dict;

    [dict release];
        NSArray *array = [[names allKeys] sortedArrayUsingSelector:@selector(compare:)];
    self.keys = array;

    isSearchOn = NO;
    canSelectRow = YES;

}

Ответы [ 4 ]

7 голосов
/ 01 апреля 2010

UISearchDisplayController имеет собственное свойство tableView, которое называется searchResultsTableView. Если вы используете searchDisplayController, попробуйте использовать:

[searchDisplayController.searchResultsTableView reloadData];
1 голос
/ 14 января 2015
[self.searchDisplayController.searchResultsTableView reloadData];
1 голос
/ 31 марта 2010

Поведение, которое вы описываете (с новыми данными, не отображаемыми до прокрутки), именно то, что я ожидал бы, если бы вы не вызывали reloadData в табличном представлении. Я бы установил несколько точек останова и удостоверился, что reloadData действительно вызывается в правом UITableView, и что вызывается cellForRowAtIndexPath, как результат reloadData.

Можно предположить, что ваш IBOutlet self.tableView не подключен, а self.tableView имеет значение NULL. Возможно, что Tableview Delegate и Datasource подключены, но не сам tableView.

0 голосов
/ 01 апреля 2010

viewDidLoad вызывается только один раз, когда загружается контроллер представления. Возможно, вы захотите обновлять таблицу каждый раз, когда отображается представление (например, при переключении вкладок), вместо этого поместите вызов reloadData в viewWillAppear.

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