2

为什么以下代码在 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?

问候,

彼得

4

2 回答 2

1

很可能rectForFooterInSection正在调用委托方法tableView:viewForFooterInSection:以计算视图框架。

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

您基本上是在告诉footerViewfor 部分与of sectionx具有UIView相同的框架,您应该返回相同的框架。你能在这里看到递归问题吗?footerViewx

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

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

于 2012-12-07T00:58:17.277 回答
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;
}
于 2013-08-29T07:02:14.507 回答