tableView numberOfRowsInSection在iOS4上调用tableView viewForHeaderInSection

时间:2013-03-19 14:11:13

标签: objective-c ios4

我有一个包含大量依赖项的大型应用。对于这种情况,我实现了一个名为RootTableViewController的类来处理每次需要表视图控制器时必须完成的所有事情。

现在我发现了一个无限循环,我不知道如何解决它。我在RootTableViewController中获得了以下代码:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    NSString *sectionTitle = [self tableView:tableView titleForHeaderInSection:section];
    int numbersOfRowInSection = [self.tableView numberOfRowsInSection:section];

    if (numbersOfRowInSection > 0)
    {
         // ...
    }
    else
    {
        UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 28.0f)];
        return view;
    }
}

这在iOS 5和iOS 6上运行完美,但在iOS4上会导致无限循环,因为[tableView numberOfRowsInSection]正在调用[tableView viewForHeaderInSection]。如何使用表格视图api解决此问题?我没有办法使用[ count]内部数据数组,因为我有很多表视图控制器使用不同的数据源扩展这个RootTableViewController

2 个答案:

答案 0 :(得分:1)

这根本不是好风格。您应该子类化或rahter实现相关的委托方法,但您不应该调用UITableView.numberofRowsInSection:

但是,您确实已实施tableView:numberOfRowsInSection。将其所有功能移至新方法myNumberOfRowsInSection:并执行相同操作。它主要是您当前numberOfRowsInSection的副本。 然后在您的代码片段调用[self myNumberOfRowsInSection:...];

tableView:numberOfRowsInSection:section内只需:

return [self myNumberOfRowsInSection:section]; 

将相同的模式应用于您可能想要自己调用的所有委托方法。将其所有业务逻辑移动到您自己的方法中,然后仅从委托方法和您自己的代码中调用您自己的方法。

答案 1 :(得分:0)

如果要在不访问内部数据数组的情况下获取数据源的某个部分中的行数,可以查询dataSource委托,例如

int numbersOfRowInSection = [self.tableView.dataSource tableView:self.tableView numberOfRowsInSection:section];

(未经过编译检查)