我现在已经有一段时间了,无论我怎么看,我似乎都无法理解这一点。假设我正在扩展UIView以在键盘上添加工具栏,我不完全确定如何传递我需要从使用该UIView的类访问的参数,以便我可以在点击新创建的工具栏项时执行操作延期。
假设我在类中实现了一个UITextView:
class MyClass : UIViewController {
var paramToAcess : String! //param to access in extension
override func viewDidLoad() {
super.viewDidLoad()
let textView = UITextView()
textView.addToolBar() //using the extension to add toolbar
self.view.addSubview(textView)
}
//////// other methods ///////
}
这是扩展名:
extension UITextView {
func addToolBar(){
let toolBar = UIToolbar()
toolBar.barStyle = UIBarStyle.default
toolBar.isTranslucent = true
toolBar.backgroundColor = UIColor.white
toolBar.tintColor = UIColor.gray
let doneButton = UIBarButtonItem(title: "Save", style: UIBarButtonItemStyle.plain, target: self, action: #selector(donePressed))
let spaceButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.flexibleSpace, target: nil, action: nil)
let cancelButton = UIBarButtonItem(title: "Cancel", style: UIBarButtonItemStyle.plain, target: self, action: #selector(cancelPressed))
toolBar.setItems([cancelButton, spaceButton, doneButton], animated: false)
toolBar.isUserInteractionEnabled = true
toolBar.sizeToFit()
self.inputAccessoryView = toolBar
}
func donePressed(){
self.resignFirstResponder()
}
func cancelPressed(){
self.resignFirstResponder()
//how to access parameters in MyClass to do stuff here?
}
}
我知道扩展不能存储属性,我试图使用协议但不能正确实现它。感谢任何帮助。
答案 0 :(得分:4)
由于您不能将存储的属性作为类扩展的一部分,您可能会发现通过子类化实现它更容易:
class MyTextViewWithToolbar: UITextView {
...
}
然后,您可以在新课程中包含所需的任何属性。
基本上我认为类扩展不是实现此要求的最佳方式,但是子类化将允许您执行上面尝试过的操作。