为什么以下代码在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?
此致
彼得
答案 0 :(得分:1)
rectForFooterInSection
调用委托方法tableView:viewForFooterInSection:
很可能是为了计算视图框架。
对我来说(并且预期)这会进入一个无限循环似乎是合理的。
您基本上告诉footerView
部分x
是UIView
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;
}