uitableview reloadData问题

时间:2010-03-31 19:42:08

标签: iphone uiviewcontroller uitableview uisearchbar tableview

我一直在调试我的iphone应用程序,发现了一些有趣的东西。

我有一个带TabBarcontroller的UIViewControllers(6个标签)。每个选项卡都是一个UIViewController,它有一个UITtableview。 viewDidLoad工作并带来初始数据。在UITableView上有一个搜索栏。在用户触摸按下搜索后,一些魔法发生,我得到一个包含数据的数组。我无法在tableview中看到新数据,并且[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 个答案:

答案 0 :(得分:7)

UISearchDisplayController有自己的tableView属性,名为searchResultsTableView。如果您使用的是searchDisplayController,请尝试使用:

[searchDisplayController.searchResultsTableView reloadData];

答案 1 :(得分:1)

您正在描述的行为(在滚动之前不显示新数据)正如我未在表视图上调用reloadData时所期望的那样。我会设置一些断点并确保在正确的UITableView上调用reloadData,并且由于reloadData而调用了cellForRowAtIndexPath。

一个猜测是你的self.tableView IBOutlet没有连线,而self.tableView是NULL。 tableview Delegate和Datasource可能已连线,但不是tableView本身。

答案 2 :(得分:1)

[self.searchDisplayController.searchResultsTableView reloadData];

答案 3 :(得分:0)

viewDidLoad仅在加载视图控制器时被调用一次。您可能希望每次显示视图时更新表(例如,当您切换选项卡时),而是将您的reloadData调用放在viewWillAppear中。