【问题标题】:iOS UITextField can't becomeFirstResponder multiple timesiOS UITextField 不能多次成为FirstResponder
【发布时间】:2013-06-10 07:22:19
【问题描述】:

我有一个UITableView 的部分,当您点击某个部分时,该部分会展开并且有可供选择的选项,或者您可以通过UITextField 在UITableViewCells 之一中插入您自己的选项。对于那个单元格,我在tableView: cellForRowAtIndexPath: 中有这段代码来配置自定义单元格并设置第一响应者。

        DataAddTVCell *dataInputcell = (DataAddTVCell *)cell;
        dataInputcell.data.delegate = self;
        self.dataTextfield = dataInputcell.data;
        [self.dataTextfield becomeFirstResponder];

数据字段是UITextField。我将UITextField 保存在self.dataTextField 中,以便以后可以resignFirstResponder。

第一次从我的DataAddTVCell 加载和扩展部分时,它工作正常并成为第一响应者。辞去第一响应者的职务也有效。但是,当另一个部分展开时再次加载单元格时,它不会成为第一响应者。如果我点击textField,键盘显示正常,我可以像以前一样辞去第一响应者的职务。不知道为什么 textField 只能成为第一响应者一次。我也有这些委托方法并设置了 UITextFieldDelegate>

- (BOOL)canBecomeFirstResponder
{
    return YES;
}

- (BOOL)becomeFirstResponder
{
    return YES;
}

我怀疑这是因为我使用的是dequeueReusableCellWithIdentifier。有没有办法让它在使用它时工作?或者,如果我希望它在显示时始终成为第一响应者,我是否每次都必须创建一个新单元格?不过,总是创建这么多细胞似乎很糟糕。

【问题讨论】:

    标签: ios objective-c textfield becomefirstresponder


    【解决方案1】:

    发生这种情况是因为每次加载单元格时,都会重新创建它以及它的子视图。结果,对您的文本字段的引用将丢失。要成功辞职,您需要保持关注父单元格以避免重新创建单元格。

    编辑

    另一种选择是您记住单元格的索引路径,即您想成为第一响应者的文本字段。在该索引路径创建单元格时,遍历其子视图,捕获文本字段的引用并在其上调用 becomeFirstResponder。

    你需要做我上面提到的同样的事情。在cellForRowAtIndexPath:的适当位置写下如下代码:

     if(indexPath.section == 0)//your section in which that cell is present. e.g. 0
                {
                    if(indexPath.row == 1)//cell no. 1
                    {
                        if(showingInputCell)//flag to keep track either it is textfield cell or other
                        {
                            for (UIView * subview in cell.subviews) {
                                if([subview isKindOfClass:[UITextField class]])
                                    [(UITextField *)subview becomeFirstResponder];
                            }
                        }
                    }
                }
    

    【讨论】:

    • 但我每次都将 self.dataTextField 重新分配给新的 cell.data。你能详细说明一下吗?
    • @user1529956 首先告诉我,您希望将文本字段集中在某个特定(固定)indexPath 上?
    • 我有它,所以当您点击某个部分中的第 1 行时,它会将单元格更改为用于输入的单元格,即带有文本字段的单元格,我想成为第一响应者
    • @user1529956 看到我的回答。希望对你有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多