2017-02-09 12 views
1

私はこれにしばらくお待ちしており、何を見てもこのことを理解できないようです。キーボード上にツールバーを追加するためにUIViewを拡張しているとします。そのUIViewを使用しているクラスからアクセスする必要があるパラメータを渡す方法が完全にはわかりません。そのため、拡張。私は、プロトコルを使用しようとしました、私は拡張プロパティを格納していないことを知っているクラスからその変数が使用しているオブジェクトの拡張機能に変数を渡すにはどうすればよいですか?

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 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 /////// 
} 

と拡張したものです:

は、私はクラスでUITextViewを実施していると言います正しく実装することはできません。助けをお待ちしています。

+0

できません。あのようでなく。 MVCモデルを破壊して、その2つの関数からクラスにアクセスしようとします。クラスに固有のことが本当に必要な場合は、クラス内のツールバーを作成することができます。このツールバーを何度も使用している場合は、拡張機能が必要です。 –

+0

私は同意すると、サブクラス化は良い選択と思われる。しかし、他の方法があると好奇心が強いのであれば、それらは何か..コメントありがとう – TheeBen

答えて

4

あなたはそれが簡単にサブクラス化することでこれを実現するために見つけるかもしれないクラス拡張の一部としての性質を保存していることができないので:

class MyTextViewWithToolbar: UITextView { 
    ... 
} 

その後、あなたは新しいクラスに必要なものは何でもプロパティ含めることができます。

基本的には、この要件を実装するにはクラス拡張が最善の方法ではないと思うのですが、サブクラス化すると上で試したことができます。

+0

あなたの返事のおかげで、これは間違いなく答えです。 ..これ以上のものが表示されない場合は、これを受け入れます.. – TheeBen

+0

あなたのView Controllerのインスタンスが1つしかない場合は、それをシングルトンにしてクラス拡張からアクセスできます。私はそれが良い設計ではないので、あなたがそれをしないことを強くお勧めします、サブクラス化のソリューションはより洗練されています。 – simonWasHere

+0

シングルトンのファンではなく、私が同意します – TheeBen

関連する問題