viewForFooterInSection陷入无限循环

时间:2012-12-06 23:26:48

标签: uitableview ios5 crash ios6 infinite

为什么以下代码在iOS 6中运行良好。但在iOS 5中,它会陷入无限循环,导致设备崩溃。一旦执行“self.footerView = ...”行,它就会再次调用viewForFooterInSection。因此将其捕获在无限循环中。

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{
    if (!self.footerView)
        self.footerView = [[UIView alloc] initWithFrame:[tableView rectForFooterInSection:section]];

    return self.footerView;
}

有更好的方法吗?为什么这适用于iOS 6但不适用于5?

此致

彼得

2 个答案:

答案 0 :(得分:1)

rectForFooterInSection调用委托方法tableView:viewForFooterInSection:很可能是为了计算视图框架。

对我来说(并且预期)这会进入一个无限循环似乎是合理的。

您基本上告诉footerView部分xUIView footerView x footerView部分{{1}}你应该回来。你能在这里看到递归问题吗?

显然iOS 6中有一些实现更改可以防止无限循环(可能依赖于页脚框架的某些默认值),但委托方法的上述实现仍然是错误的。

您应该独立定义{{1}}并在委托方法中返回它。

答案 1 :(得分:1)

我有这个问题。这种设置页脚的方式最适合我,因为我想定期刷新页脚,有一个标签的句柄很好。如果你正在递归,只需返回nil,apple将帮助你找出矩形(即使在iOS 4.3到5.1中)。

static BOOL alreadyCheckingFooter = false;
- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{
    if (!self.footerView) {
        if (alreadyCheckingFooter)
            return nil;
        alreadyCheckingFooter = true;
        self.footerView = [[UIView alloc] initWithFrame:[tableView rectForFooterInSection:section]];
        alreadyCheckingFooter = false;
    }

    return self.footerView;
}