UITableView reloadData - 未触发cellForRowAtIndexPath

时间:2010-08-12 18:41:31

标签: iphone uitableview reloaddata

我有splitViewController,它具有MasterViewController的一些viewController和DetailViewController的一些tableViewController。当我按下masterViewController上的一个按钮时,我想在detailViewController中显示新的tableViewController而不是现有的。

所以我喜欢这样:

SearchDetailViewController *searchDetailViewController = [[SearchDetailViewController alloc] initWithStyle:UITableViewStylePlain];
UINavigationController *searchDetailNavigationController = [[UINavigationController alloc] initWithRootViewController:searchDetailViewController];

之后我将数据传递到new tableController中显示:

[searchDetailViewController passInSearchResults:listOfItems];

之后我将“新控制器”推送到splitViewController:

[searchSplitViewController setViewControllers:[NSArray arrayWithObjects:self.navigationController, searchDetailNavigationController, nil]];

在目标tableViewController方法中传递“passInSearchResults”数据,我也调用reloadData。方法如下:

- (void)passInSearchResults:(NSMutableDictionary *)searchResults {
    self.searchResultList = searchResults;
    NSLog(@"Data is passed in: %@",self.searchResultList);
    [self.tableView reloadData];
    //[self.tableView setNeedsDisplay];
}

控制台:传入数据:[这里我得到了我想要的确切数据,看起来恰到好处。]

After this I see that method "numberOfRowsInSection" is fired:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    NSLog(@"Setting table length: %i",[self.searchResultList count]);
    return [self.searchResultList count];
}

控制台:设置表格长度:[这里我得到适当的长度]

问题是该表未填充传递的数据,并且未调用“cellForRowAtIndexPath”方法。

如何在reloadData方法中触发“numberOfRowsInSection”而不是方法“cellForRowAtIndexPath”... ???

由于

7 个答案:

答案 0 :(得分:10)

调用[self.tableView reloadData];

时,检查您是否在主线程中
- (void)passInSearchResults:(NSMutableDictionary *)searchResults {
 if ([NSThread isMainThread]) {
    self.searchResultList = searchResults;
    NSLog(@"Data is passed in: %@",self.searchResultList);
    [self.tableView reloadData];
}
else {
    [self performSelectorOnMainThread:@selector(passInSearchResults:) searchResults waitUntilDone:NO];
}

}

答案 1 :(得分:4)

  

如何在reloadData方法中触发“numberOfRowsInSection”而不是方法“cellForRowAtIndexPath”... ???

在使用相同(ish)问题花了一天之后,我想我们在这里发现了一个错误。我确实找到了黑客/解决方法。

如果我改变了我的cellForRowAtIndexPath方法中使用的数组(添加/删除值或者再次完全构建它),那么当你重新加载数据时它似乎再次正确地调用了cellForRowAtIndexPath。

例如,在我的cellForRowAtIndexPath中,我有类似的内容:

cell.textLabel.text = [[[self.searchResultsArrayWithSections objectAtIndex:indexPath.section] objectForKey:@"rowValues"] objectAtIndex:indexPath.row];

    return cell;

我还有一个方法来构建这个在viewDidLoad上调用的数组:

    - (NSMutableArray *)splitIntoSectionsWithAlphabet:(NSMutableArray *)myArray 
{    
NSString *letters = @"abcdefghijklmnopqrstuvwxyz";
NSMutableArray *content = [NSMutableArray new];

//code to build array here, nothing special really

return content;
}

所以我注意到如果我在调用reloadData之前在searchResultsArrayWithSections数组上再次专门调用此方法,它实际上会正确调用所有UITableViewDelegate方法! (就像我说的,黑客但它有效!)

//dirty hack, bug with cancel button and not realoding data, seems we have to modify this array before it will work correctly
self.customerListArrayWithSections = [self splitIntoSectionsWithAlphabet:self.customerListArray];
[self.customerListTv reloadData];

答案 2 :(得分:4)

检查你的numberOfRows,如果它是0,则没有要显示的单元格。

答案 3 :(得分:3)

在我的情况下,问题是没有从主线程调用 reloadData()函数。

我已将此更改为 dispatch_async()函数,从而解决了问题:

dispatch_async(dispatch_get_main_queue(), {
    self.tableView.reloadData()
})

希望这有助于其他人。

答案 4 :(得分:1)

我遇到了同样的问题,但决定很简单。 首先,你能尝试滚动表吗? tableView:cellForRow ...应该被调用。 检查tableView的标题高度和contentOffset。

答案 5 :(得分:0)

此外,您可以在viewController的init [With ...]方法中分配表,并在IB中连接相同的属性。通过这种方式,可能会调用numberOf ... delegate方法,而cellForRow ...则不会。

答案 6 :(得分:0)

我的" AutoLayouted " UITableView没有在reloadData上调用cellForRowAtIndexPath,因为我错误地设置了框架。

_tableView = [[UITableView alloc] initWithFrame:self.view.frame];
_tableView.translatesAutoresizingMaskIntoConstraints = NO;

通过将其更改为CGRectZero,它可以工作..

_tableView = [[UITableView alloc] initWithFrame:CGRectZero];
_tableView.translatesAutoresizingMaskIntoConstraints = NO;