【发布时间】:2013-02-18 11:41:36
【问题描述】:
我最近碰巧在 UITableView 中发现了一些关于选择和取消选择功能的有趣错误。 (m.b. 这本身不是一个错误,但我觉得这种情况非常反常)。
史前史:我正在尝试创建一些自定义 TableViewCell 类,该类将能够使用 UIDatePicker 选择一些日期并将其放置在单元格的标签中。 "CellDate" sample 对我来说不是很好。所以我试图将一些自定义 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它工作得很好,但有一些错误。
当我在屏幕上显示我的自定义单元格时(即没有滚出屏幕)一切都是正确的,但如果我选择它
向下滚动 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,所以我可能对它的某些方面不是很熟悉。
附:抱歉我的语言不好,我不是以英语为母语的人。
更新:
我发现了更多细节。经过一些研究,我发现,当您滚动 tableView 并在屏幕外隐藏一些 tableViewCell 时,它的(单元格)正在被破坏。当您向后滚动时,它会通过调用 tableView 的委托的 tableView:cellForRowAtIndexPath 再次创建: 除此之外,如果您尝试为行的 indexPath 调用 [tableView cellForRowAtIndexPath:indexPath],即在屏幕外,tableView 将返回 nil。
但奇怪的是:当您的自定义单元格是 firstResponder 时,显然,它不会通过 tableView 的委托的 tableView:cellForRowAtIndexPath: 重新创建,也无法通过 [tableView cellForRowAtIndexPath:indexPath] 访问。
对我来说,这很奇怪。
【问题讨论】:
标签: ios cocoa-touch uitableview