如何将变量从 class 传递到 class 正在使用的对象的扩展?
How to pass variables from a class to an extension of an object that the class is using?
我已经研究了一段时间了,但无论我查找什么,我似乎都无法理解这一点。假设我正在扩展 UIView 以在键盘上添加一个工具栏,我不完全确定如何传递我需要从使用该 UIView 的 class 访问的参数,以便我可以在点击新创建的工具栏时执行操作该扩展中的工具栏项目。
假设我在 class 中实现了一个 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?
}
}
我知道扩展不能存储 属性,我尝试使用协议但无法正确实现它。感谢任何帮助。
由于您不能将存储的属性作为 class 扩展的一部分,您可能会发现通过 subclassing:
更容易实现这一点
class MyTextViewWithToolbar: UITextView {
...
}
然后您可以在新 class.
中包含您需要的任何属性
基本上我认为 class 扩展不是实现此要求的最佳方式,但是 subclassing 可以让你做上面尝试过的事情。
我已经研究了一段时间了,但无论我查找什么,我似乎都无法理解这一点。假设我正在扩展 UIView 以在键盘上添加一个工具栏,我不完全确定如何传递我需要从使用该 UIView 的 class 访问的参数,以便我可以在点击新创建的工具栏时执行操作该扩展中的工具栏项目。
假设我在 class 中实现了一个 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?
}
}
我知道扩展不能存储 属性,我尝试使用协议但无法正确实现它。感谢任何帮助。
由于您不能将存储的属性作为 class 扩展的一部分,您可能会发现通过 subclassing:
更容易实现这一点class MyTextViewWithToolbar: UITextView {
...
}
然后您可以在新 class.
中包含您需要的任何属性基本上我认为 class 扩展不是实现此要求的最佳方式,但是 subclassing 可以让你做上面尝试过的事情。