如何在协议中实现此代码以实现面向协议的编程?一个大问题是解决@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协议扩展