您好,我在我的应用程序上发现了一个问题,可能并不重要但很奇怪。
我的 viewController 中有一个开关,我们称它为 theSwitch,当我填充单元格时,在 indexPath (0,0) 上,我将该开关作为附件视图。
单元格的标题会根据开关的状态而变化
//Code simplified for simplicity
if(indexPath.section == 0 && indexPath.row == 0) {
cell.textLabel.text = self.filtersActivatedSwitch.on ? NSLocalizedString(@"Filters activated", nil) : NSLocalizedString(@"Filters deactivated", nil);
cell.accessoryView = self.filtersActivatedSwitch;
}
当按下开关时,调用此方法
-(void)switchActivated {
[self.tableView reloadRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:0 inSection:VisibilityFilterTableViewSectionMasterFilter]];
}
这将造成死锁,因为在方法 cellForRowAtIndexPath 上,当我尝试使单元格出队时,它将创建一个新的(经过测试,我认为它使用了我想重新加载的相同单元格更有意义)并且在单元格的配置,开关将添加为附件视图...
这就是它变得棘手的地方......
BadPirate 的回答解释了何时在 tableviewcell 上调用 layoutSubview
-addSubview 导致 layoutSubviews 在被添加的视图、它被添加到的视图(目标视图)以及目标的所有子视图上调用
我认为 removeFromSupperview (假设)也应该发生同样的情况,所以新单元格调用了 layoutSubview .. 它检查附件视图,看到它不是 nil 所以它添加它作为子视图,另一方面在旧单元格中(即由于任何原因没有出队,所以我无法清除附件视图)layoutSubviews 被调用,因为 removeFromSuperview (再次假设)它检查附件视图不为零,它将开关添加为子视图......并永远重复。
我的问题是......为什么表格视图不使用已经出列的单元格?两个 tableviewcells 具有相同的附件视图这一事实显然会使我的应用程序崩溃。
还是我错误地使用了附件视图?
干杯!
编辑:这是prepareForReuse上的代码
- (void)prepareForReuse {
[super prepareForReuse];
for (UIView *view in self.contentView.subviews) {
[view removeFromSuperview];
}
for (UIView *view in self.imageView.subviews) {
[view removeFromSuperview];
}
self.textLabel.text = nil;
self.detailTextLabel.text = nil;
self.imageView.image = nil;
self.imageView.tag = 0;
self.accessoryView = nil;
}