如何将变量从类传递到类正在使用的对象的扩展?

时间:2017-02-09 09:47:26

标签: ios swift swift-extensions

我现在已经有一段时间了,无论我怎么看,我似乎都无法理解这一点。假设我正在扩展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? 
    }

}

我知道扩展不能存储属性,我试图使用协议但不能正确实现它。感谢任何帮助。

1 个答案:

答案 0 :(得分:4)

由于您不能将存储的属性作为类扩展的一部分,您可能会发现通过子类化实现它更容易:

class MyTextViewWithToolbar: UITextView {
    ...
}

然后,您可以在新课程中包含所需的任何属性。

基本上我认为类扩展不是实现此要求的最佳方式,但是子类化将允许您执行上面尝试过的操作。