2017-04-21 16 views
1

私は自分自身のクラス内の通知のオブザーバを設定しようとしています。通知センター

私が作ることtextFieldか何かをタップすると、これは実際には動作しません、私たちは、たとえば以下のようなものを持っているとしましょう

public class MyClass { 

    var center: NotificationCenter 

    public init() { 
    center = NotificationCenter.default 
    } 

    public run() { 
    center.addObserver(self, selector: #selector(test), name: .UIKeyboardDidShow, object: nil) 
    } 

    func test() { 
    Print("TESTED!") 
    } 
} 

と私のViewControllerで、

override func viewDidLoad() { 
    super.viewDidLoad() 

    let myClass = MyClass() 
    myClass.run() 
} 

キーボードアップ。確かに

NotificationCenter私はMyClassを使用せずにこれを行う場合に動作、または私は以下のようなオブザーバーとして登録したオブジェクトを変更した場合:

center.addObserver(ViewController.self, selector: #selector(test), name: .UIKeyboardDidShow, object: nil) 

、その後、もちろん、私のようにViewControllerの内側に私のtest機能を実装する必要がありますa class function

しかし、これは私が望む方法ではありません。なぜこれが機能していないのかを説明するアドバイスやアドバイスはありませんか?

+0

textfield begin delegateを試しましたか?彼らはかなり共通しているので、myClass.run()私は実際に 'textfields'と' keyboard'通知に動作するようにしようとしていないよ – karthikeyan

+0

@karthikeyanは、私は一例として、それらを与えました。したがって、同じ動作の回避策は必要ありません。私は実際に 'NSManagedObjectContextObjectsDidChange'通知を観察しようとしています。 – sCha

答えて

2

myClassは、viewDidLoadの最後に破棄されます。それへの参照は何もないからです。 ViewControllerでプロパティを作成する必要があります。

var myClass: MyClass? 

override func viewDidLoad() { 
    super.viewDidLoad() 

    myClass = MyClass() 
    myClass?.run() 
} 
+0

それは私の問題を解決した、ありがとう。 – sCha

関連する問題