0

我最近碰巧在 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] 访问。

对我来说,这很奇怪。

4

2 回答 2

0

我自己找到了解决方案。It appears to be as simple as resigning first responder when other row is being selected. 顺便说一句,我用这个答案来完成这个。

希望它可以帮助某人。

于 2013-02-20T09:51:04.960 回答
0

To directly answer the question, the UITableView does not deselect cells on it's own. In your TableView's controller, you need to override -(void)tableView:(UITableView *)tableView didselectRowAtIndexPath:(NSIndexPath *)indexPath and manually deselect the selected cell.

-(void)tableView:(UITableView *)tableView didselectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [tableView deselectRowAtIndexPath:indexPath animate:YES];
}

(apologies for editing, i accidentally saved while answering)

In your subclass of the UITableViewCell you should override -(void)setEditing:(BOOL)editing animated:(BOOL)animated in order to transition your cells into an editable state. (set your UITextField to editable) and then in your cell, you would make your textbox become/resign first responder.

First responder is used to become the next object to respond to the keyboard when something is editable.

For example, if you have cell c1, and cell c2. both c1 and c2 have UITextFields in them. You are in c1, and you want the Return button in the keyboard to move the text cursor into c2, then when c1, would need to make the UITextField resign as the first responder, and tell c2 to make it's UITextField become the first responder. You would do this by making the custom cell be the delegate of it's UITextField, then implement -(BOOL)textFieldShouldReturn:(UITextField *)textField to have the textField resign as first responder, then you would tell your UITableView's controller to tell the next cell to make it's textfield become first responder.

于 2013-02-19T20:16:29.167 回答