9

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

所以我这样做了:

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

之后,我传递数据以显示在新的 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”......?

谢谢

4

7 回答 7

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];
}

}

于 2012-07-09T15:50:52.460 回答
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];
于 2011-04-21T00:01:16.153 回答
4

检查您的 numberOfRows,如果为 0,则没有要显示的单元格。

于 2012-11-11T01:47:47.423 回答
3

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

我通过将它放在一个dispatch_async()函数中来改变它,从而解决了这个问题:

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

希望这对其他人有帮助。

于 2016-03-11T04:08:10.427 回答
1

我有同样的问题,但决定很简单。首先,您可以尝试向下滚动表格吗?tableView:cellForRow... 应该被调用。检查 tableView 的标题高度和 contentOffset。

于 2011-12-20T14:05:04.320 回答
0

您也可以在 viewController 的 init[With...] 方法中分配表,并在 IB 中连接相同的属性。这样,可能会调用 numberOf... 委托方法而 cellForRow... 不会。

于 2013-02-19T04:25:27.427 回答
0

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

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

通过将其更改为 CGRectZero,它起作用了..

_tableView = [[UITableView alloc] initWithFrame:CGRectZero];
_tableView.translatesAutoresizingMaskIntoConstraints = NO;
于 2015-03-30T20:53:29.057 回答