UITableView委托方法调用两次

时间:2010-04-14 14:49:12

标签: objective-c iphone uitableview delegates call

今天我的问题是关于UITableViewController-s 特别是我注意到了数据源委托方法

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;

被调用两次(即使例如我只是创建一个基于导航的应用程序而不添加一行代码..添加一个NSLog来跟踪它)。 现在,因为在我的应用程序中,我需要确定基于文件系统中文档选择的部分数量,我需要调用一些方法来实现。我已经将这些方法放在上面提到的方法中,因此它们将被调用两次,这是我不需要的。 问题是为什么它被调用两次,我可以调用一次吗? 我希望在官方文档中没有明确说明(这意味着我根本不读它:))。顺便说一句,我可以看到其他人发布类似的问题,但我找不到一个完全令人满意的答案。 谢谢。

4 个答案:

答案 0 :(得分:12)

我遇到了同样的问题,只是调用了numberOfRowsInSection: 对于我收到的每个电话,答案都放在堆栈跟踪中。

  1. 第一次调用是由于我在viewDidLoad中创建的表头视图的更改:我的viewcontroller。

    thumbView.tableHeaderView = nil;
    thumbView.tableFooterView = nil;
    

    这导致内部调用 _updateContentSize:,调用 heightForTable:,最终调用 numberOfRowsInSection:。这是我触发的内容,可以通过不执行上述代码轻松避免:)

  2. 第二次调用是合法的,以便重新加载数据。这是由布局事件触发的,很可能你不能跳过它。

  3. 我确信你可以观察到类似于numberOfSections:method

    的东西

    所以,我的结论是,由于UITableView的实现,有很多情况下某些委托方法会被调用两次或更多,因为表视图必须刷新一些东西。我尝试围绕这个bug / feature / etc.设计我的代码。

    希望有所帮助

答案 1 :(得分:2)

如果您的tableview包含在子视图控制器中, 在您的父ViewController上试试这个

[parentViewController addChildViewController:childViewController];

之前[parentViewController.view addSubview:childViewController.view]

答案 2 :(得分:0)

请在添加TableView后检查您的代码,您可能会再次使用realodData方法调用ViewWillAppear方法

答案 3 :(得分:0)

如果您在故事板中错误地更改了表格视图的框架,则会发生这种情况。您点击故事板上已将表格视图添加为子视图,现在您的表格可能没有正确的框架你已经开始了。