UIBarButtonItem 的@IBAction 未从表视图的通用单元格内的 UIToolbar 调用
@IBAction of UIBarButtonItem not being called from UIToolbar inside generic cell of tableview
事实是我创建了一个如下所示的通用单元格:
class GenericCell<T: ProtocolName>: UITableViewCell {
// Properties ...
var someThingINeed: T?
private var toolbar: UIToolbar = {
let toolbar = UIToolbar()
toolbar.sizeToFit()
toolbar.isUserInteractionEnabled = true
let doneButton = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(didTapDone))
let flexibleSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
let cancelButton = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(didTapCancel))
cancelButton.tintColor = .red
toolbar.setItems([cancelButton, flexibleSpace, doneButton], animated: false)
return toolbar
}()
override var inputAccessoryView: UIView? {
if someThingINeed != nil {
return toolbar
}
return nil
}
override var canBecomeFirstResponder: Bool {
return true
}
override var canResignFirstResponder: Bool {
return true
}
// Functions ...
@objc private func didTapDone() {
// do something...
resignFirstResponder()
}
@objc private func didTapCancel() {
// do something...
resignFirstResponder()
}
}
因此,为了调用单元格输入视图,我从 UITableViewController
执行此代码,该代码使用该类型的单元格处理 table:
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
if indexPath.section == 0 {
tableView.cellForRow(at: indexPath)?.becomeFirstResponder()
}
tableView.deselectRow(at: indexPath, animated: true)
}
我在执行中得到的结果是 inputView
和 inputAccessoryView
都出现了,但是当我点击两个 UIBarButtonItem
(取消或完成)中的任何一个时,按钮似乎响应并接收点击,但没有调用任何操作。
我认为原因可能是通用 Swift class 不能作为 UIView
的目标或通用 Swift class 无法实现 @objc
功能。
我不知道还能做什么,我尝试将单元格添加为 UIToolbar
的委托并执行 toolbar.translatesAutoresizingMaskIntoConstraints = false
但没有任何效果。
好的,问题是我忘记将 UIToolbar
标记为 lazy
,所以我无法使用 class 属性和函数。
我不知道为什么 Xcode 没有警告我...我认为这可以报告。
事实是我创建了一个如下所示的通用单元格:
class GenericCell<T: ProtocolName>: UITableViewCell {
// Properties ...
var someThingINeed: T?
private var toolbar: UIToolbar = {
let toolbar = UIToolbar()
toolbar.sizeToFit()
toolbar.isUserInteractionEnabled = true
let doneButton = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(didTapDone))
let flexibleSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
let cancelButton = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(didTapCancel))
cancelButton.tintColor = .red
toolbar.setItems([cancelButton, flexibleSpace, doneButton], animated: false)
return toolbar
}()
override var inputAccessoryView: UIView? {
if someThingINeed != nil {
return toolbar
}
return nil
}
override var canBecomeFirstResponder: Bool {
return true
}
override var canResignFirstResponder: Bool {
return true
}
// Functions ...
@objc private func didTapDone() {
// do something...
resignFirstResponder()
}
@objc private func didTapCancel() {
// do something...
resignFirstResponder()
}
}
因此,为了调用单元格输入视图,我从 UITableViewController
执行此代码,该代码使用该类型的单元格处理 table:
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
if indexPath.section == 0 {
tableView.cellForRow(at: indexPath)?.becomeFirstResponder()
}
tableView.deselectRow(at: indexPath, animated: true)
}
我在执行中得到的结果是 inputView
和 inputAccessoryView
都出现了,但是当我点击两个 UIBarButtonItem
(取消或完成)中的任何一个时,按钮似乎响应并接收点击,但没有调用任何操作。
我认为原因可能是通用 Swift class 不能作为 UIView
的目标或通用 Swift class 无法实现 @objc
功能。
我不知道还能做什么,我尝试将单元格添加为 UIToolbar
的委托并执行 toolbar.translatesAutoresizingMaskIntoConstraints = false
但没有任何效果。
好的,问题是我忘记将 UIToolbar
标记为 lazy
,所以我无法使用 class 属性和函数。
我不知道为什么 Xcode 没有警告我...我认为这可以报告。