【问题标题】:becomeFirstResponder does not work in cellForRowAtIndexPathbecomeFirstResponder 在 cellForRowAtIndexPath 中不起作用
【发布时间】:2015-09-11 15:09:48
【问题描述】:

当从cellForRowAtIndexPath调用textViewbecomeFirstResponder时返回false,为什么?

但是通过其他方法,即来自didSelectRowAtIndexPath,它可以工作。

是否与我使用 iOS 8 引入的UITableViewAutomaticDimension 行高方法有关?!

【问题讨论】:

    标签: ios uitableview uitextview


    【解决方案1】:

    当您查看文档时,它说视图必须位于视图层次结构中。我认为在 cellForRowAtIndexPath 方法中,文本视图尚未附加到层次结构,但是当返回单元格时。

    您可以调用此方法来使响应者对象(例如视图) 急救人员。但是,您应该只在该视图上调用它,如果它 是视图层次结构的一部分。如果视图的 window 属性持有 UIWindow 对象,它已安装在视图层次结构中;如果它 返回 nil,视图与任何层次结构分离。

    【讨论】:

    • 有趣的是,手动设置单元格高度时,它可以从 cellforrowatindexpath 调用
    • @János 当然。高度是一个对视图有意义的属性,无论它是否是视图层次结构的一部分。但是,除非它是视图层次结构的一部分,否则视图不能成为第一响应者。
    • works 表示成为firstresponder 工作,当手动设置高度时
    【解决方案2】:

    尝试在表格视图单元格的自定义方法(如 layoutSubviews)中调用 becomeFirstResponder,因为此时文本视图将被添加到视图层次结构中。如果您在 cellForRowAtIndexPath 方法中调用它,则文本视图尚未添加到视图层次结构中并且它不起作用。

     - (void)layoutSubviews{
        // Initialization code
    
        if ([self.textView becomeFirstResponder]) {
    
            NSLog(@"yes");
        }
    }
    

    【讨论】:

    • 当调用 awakeFromNib 时,单元格是否确定是视图层次结构的一部分?我认为 awakeFromNib 是在连接出口和动作之后调用的,但在视图插入到它的超级视图之前。 (不过我不确定。)
    • 你是对的!!!在调用 awakeFromNib 时,它不能成为层次结构的一部分。我将编辑我的答案
    【解决方案3】:

    出于以下目的劫持 viewDidAppear:

    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)
    
        let indexPath = NSIndexPath(forRow: whatever, inSection: 0mostlikely)
        if let cell = tableView.cellForRowAtIndexPath( indexPath) as? YourTableViewCellClass {
            cell.textField.becomeFirstResponder()
        }
    }
    

    viewDidLayoutSubviews 更昂贵,因为它被称为无数次 而 viewDidAppear 只被调用一次

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多