我有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”... ???
由于
答案 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;