我最近碰巧在 UITableView 中发现了一些关于选择和取消选择功能的有趣错误。(mb这本身不是一个错误,但我发现这种情况非常反常)。
史前史:我试图创建一些自定义 TableViewCell 类,该类将能够使用 UIDatePicker 选择一些日期并将其放置在单元格的标签中。“ CellDate”示例对我来说不是很好。所以我试图将一些自定义 inputView 设置为单元格并使其成为第一响应者。After some time of researches I found the way to override readonly inputView property of my custom UITableViewCell subclass, and now it works perfectly: when the cell is selected I call [self becomeFirstResponder]
on it and when the cell is deselected I call [self resignFirstResponder]
so it works just fine, but有一些错误。
当我在屏幕上有我的自定义单元格(即没有滚动出屏幕)时,一切都是正确的,但如果我选择它
向下滚动 tableView,使我的单元格不再出现在屏幕上
然后选择另一个单元格
我的自定义单元格不会被取消选择
.
默认 UITableViewCell 功能的唯一主要变化是:
- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
[super setSelected:selected animated:animated];
if (selected)
{
[self becomeFirstResponder];
}
else
{
[self resignFirstResponder];
}
}
- (BOOL)canBecomeFirstResponder
{
return YES;
}
仅使用此方法覆盖会使此错误出现:当当前选择的自定义单元格不在屏幕上时,由于某种原因它不会取消选择。
我的问题是:有没有人经历过这样的事情,我能做些什么吗?因为除此之外,我对日期单元的问题有一个完美的解决方案。
这不是使用 UITableViewCells 的正确方法吗?我做错了什么吗?我刚开始学习iOS,所以我可能对它的某些方面不太熟悉。
PS对不起我的语言不好,我不是以英语为母语的人。
更新:
我发现了更多细节。经过一些研究,我发现,当您滚动 tableView 并在屏幕外隐藏一些 tableViewCell 时,它的(单元格)正在被破坏。当您向后滚动时,它会通过调用 tableView 的委托的 tableView:cellForRowAtIndexPath: 再次创建:除此之外,如果您尝试为行的 indexPath 调用 [tableView cellForRowAtIndexPath:indexPath],即在屏幕外,tableView 将返回 nil .
但奇怪的是:当您的自定义单元格是 firstResponder 时,显然,它不会通过 tableView 的委托的 tableView:cellForRowAtIndexPath: 重新创建,也无法通过 [tableView cellForRowAtIndexPath:indexPath] 访问。
对我来说,这很奇怪。