使用swift中的协议在UITableViewCell中实现我的UITextField工具栏



如何在协议中实现此代码以实现面向协议的编程?一个大问题是解决@objc方法,这在协议中是不允许的。第二个是这个代码现在用于许多单元格中的UITextField,这就是我扩展UIView的原因,也是我更正endediting的原因

原始代码在这里找到

//used inside a cell with a UITextField
extension UIView {

func toolBar() -> UIToolbar{
let toolBar = UIToolbar()
toolBar.barStyle = .default
toolBar.isTranslucent = true
toolBar.barTintColor = UIColor.init(red: 0/255, green: 25/255, blue: 61/255, alpha: 1)
let space = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
let buttonTitle = "Done"
let cancelButtonTitle = "Cancel"
let doneButton = UIBarButtonItem(title: buttonTitle, style: .done, target: self, action: #selector(onClickDoneButton))
let cancelButton = UIBarButtonItem(title: cancelButtonTitle, style: .plain, target: self, action: #selector(onClickCancelButton))
doneButton.tintColor = .white
cancelButton.tintColor = .white
toolBar.setItems([cancelButton, space, doneButton], animated: false)
toolBar.isUserInteractionEnabled = true
toolBar.sizeToFit()
return toolBar
}
@objc func onClickDoneButton(){
//        view.endEditing(true)
self.endEditing(true)
}
@objc func onClickCancelButton(){
//        view.endEditing(true)
self.endEditing(true)
}
}

编辑Sandeep Bhandari的回答这是的工作实现

首先我添加了一个带有的文件

extension UIView: ToolBarProtocol {}

然后在我的牢房里,现在我有:

let selDone = #selector(onClickDoneButton)
let selCancel = #selector(onClickCancelButton)
self.cellTextfield.inputAccessoryView = toolBar(with: selDone, cancelSeclector: selCancel)
@objc func onClickDoneButton() {
self.endEditing(true)
}

@objc func onClickCancelButton() {
self.endEditing(true)
}

我想你能做的最好的就是

protocol ToolBarProtocol where Self: UIView {
func toolBar(with doneSelector: Selector?, cancelSeclector: Selector?) -> UIToolbar
}
extension ToolBarProtocol {
func toolBar(with doneSelector: Selector?, cancelSeclector: Selector?) -> UIToolbar{
let toolBar = UIToolbar()
toolBar.barStyle = .default
toolBar.isTranslucent = true
toolBar.barTintColor = UIColor.init(red: 0/255, green: 25/255, blue: 61/255, alpha: 1)
let space = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
let buttonTitle = "Done"
let cancelButtonTitle = "Cancel"
let doneButton = UIBarButtonItem(title: buttonTitle, style: .done, target: self, action: doneSelector)
let cancelButton = UIBarButtonItem(title: cancelButtonTitle, style: .plain, target: self, action: cancelSeclector)
doneButton.tintColor = .white
cancelButton.tintColor = .white
toolBar.setItems([cancelButton, space, doneButton], animated: false)
toolBar.isUserInteractionEnabled = true
toolBar.sizeToFit()
return toolBar
}
}

简而言之您不能为@objc协议提供默认扩展。

这与这个问题有什么关系

您不能为done和cancel按钮选择器提供默认扩展,因为它们需要用@objc进行注释(典型的选择器签名是选择器(@objc方法((,并且一旦您向它们添加@objc,编译器就会给您一个编译错误

@objc只能与类、@objc协议和的成员一起使用类的具体扩展

因此,为了使您的协议与@objc功能兼容,您将最终将其制作为@objc协议,如果您制作了一个协议@obqc,则无法为该提供默认扩展

有关更多详细信息,请参阅Objective-C类中的Swift协议扩展

最新更新