如何通过选择器设置 textField becomeFirstResponder

问题描述

我编写了一个 <div className="menu-icon" onClick={handleClick}> <i className={click ? 'fas fa-times' : 'fas fa-bars'}/> </div> 扩展程序来为自定义输入构建自己的工具栏:

UITextfield

我是这样使用的:

func addToolbar(selector: Selector? = nil) {
    let action = selector == nil ? #selector(resignFirstResponder) : selector
    
    let flexibleSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace,target: nil,action: nil)
    let doneButton = UIBarButtonItem(barButtonSystemItem: .done,target: self,action: action)

    let toolbar = UIToolbar()
    toolbar.items = [flexibleSpace,doneButton]
    toolbar.sizetoFit()
    toolbar.layoutIfNeeded()
    
    inputAccessoryView = toolbar
    returnKeyType = .done
}

正如您想象的那样,在用户按下工具栏中的完成后,我希望下一个 let myPickerView = UIPickerView() myPickerView.dataSource = myPickerViewBehavior myPickerView.delegate = myPickerViewBehavior if let selected = value { let selectedindex = PickableItemType.index(of: selected.rawValue) myPickerView.selectRow(selectedindex,inComponent: 0,animated: true) } myTextField.delegate = self myTextField.inputView = myPickerView myTextField.addToolbar(selector: #selector(nextTextField.becomeFirstResponder)) UITextField。 但什么也没有发生。 对于测试,我尝试使用带有 becomeFirstResponder 语句和/或 @objs func 的简单 print,结果相同。 我还尝试将 nextTextField.becomeFirstResponderUITapGestureRecognizer 一起使用,结果也是一样。

所以我猜这与#selector机制有关,为什么代码不起作用。

P.S.:如果 #selector(nextTextField.becomeFirstResponder) 内有 selector == niladdToolbar 可以正常工作。

解决方法

我认为问题是由设置 target: 时错误的 doneButton 引起的。

如果您还在 addToolbar: 方法中提供目标,例如:

func addToolbar(target: Any? = nil,selector: Selector? = nil) {
    let object = target ?? self
    let action = selector ?? #selector(resignFirstResponder)
    
    let flexibleSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace,target: nil,action: nil)
    let doneButton = UIBarButtonItem(barButtonSystemItem: .done,target: object,action: action)

    let toolbar = UIToolbar()
    toolbar.items = [flexibleSpace,doneButton]
    toolbar.sizeToFit()
    toolbar.layoutIfNeeded()
    
    inputAccessoryView = toolbar
    returnKeyType = .done
}

这应该有效:

firstTextField.addToolbar(target: secondTextField,selector: #selector(becomeFirstResponder))

这是一个小测试结果:

https://imgur.com/R7R1ee9