问题描述
我编写了一个 <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.becomeFirstResponder
与 UITapGestureRecognizer
一起使用,结果也是一样。
所以我猜这与#selector机制有关,为什么代码不起作用。
P.S.:如果 #selector(nextTextField.becomeFirstResponder)
内有 selector == nil
,addToolbar
可以正常工作。
解决方法
我认为问题是由设置 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))
这是一个小测试结果: