オブザーバーを追加してビューコントローラーから削除する機能を分離したいと考えています。現在、私はviewWillAppear()
メソッドでオブザーバを追加しており、viewWillDisappear()
のオブザーバを削除しています。今、私はライトビューコントローラを別のクラスにこのビューコントローラからオブザーバコードを分離したいと思っています。 私は新しいクラスを作成し、このビューコントローラを新しいクラスのデリゲートとして設定する必要があると思いますが、これについてはわかりません。誰かが私にこのことを手伝うことができたら本当に感謝します。ObserverコードをViewControllerから別のクラスに変更する
答えて
オブザーバーとはどういう意味ですか? NSNotificationCenter?たぶん、コードスニペットではっきりさせるかもしれませんか?
FWIW ... viewWillAppear()およびviewWillDisappear()は、ビューの生涯に複数回呼び出すことができるので、そのことを念頭に置いてください。このスキャンテリオでは、バランスが取れていれば問題ありません。
通常、init/dealloc(Objc-C)またはinit/deinit(Swift)でオブザーバを追加/削除し、isViewLoadedを使用して、UIが表示されていないときにUIに触れないようにします。
あなたの実際のオブザーバーパターンについては、オブザーバーコールバックを処理するために、私は確かに新しいクラスを作り出しました。ただし、オブザーバコールバックへの応答がビューコントローラのユーザインタフェースを更新することである場合、懸念事項の分離がいくつかあります。おそらく最も良いことは、View ControllerがinitのNSNotificationCenterイベントを自動的にリッスンし、deallocで自身を削除する新しいクラスをスピンアップさせることでしょう。次に、単純な@requiredプロトコルをクラスの弱い代理人として定義します。あなたのView Controllerはこのオブジェクトを作成することができます(または、テストのためには、initで依存関係を注入する方が良い)、そのプロトコルに準拠してデリゲートとして自身を割り当てることができます。
何か本当にスマート取得するために
@protocol MyObservable {
@required
-(void)myXYZEventDidOccur;
}
@interface MyObserver : NSObject {
-(instancetype)initWithDelegate:(id<MyObservable>)delegate;
}
@interface MyObserver()
@property (nonatomic, weak, readwrite, nullable) id<MyObservable>delegate;
}
@implementation MyObserver {
-(instancetype)initWithDelegate:(id<MyObservable)delegate {
self = [super init];
if(self == nil) { return nil; }
self.delegate = delegate;
[NSNotificationCentre defaultCentre] addObserver...];
}
-(void)dealloc {
[NSNotificationCentre defaultCentre] removeObserver...];
}
-(void)didReceiveNotificationXYZ:(NSNotification *)notification {
[self.delegate myXYZEventDidOccur];
}
}
ようにあなたは、デリゲートを設定しているまで、あなたも観察気にすることはできません。同様に、代理人がいないときは観察をやめてください。
- 1. 別のクラスの別のスレッドからJavaFX GUIを変更する
- 2. 1つのViewControllerから別のViewControllerにオブジェクトを渡すには
- 3. 1つのviewcontrollerから別のviewcontrollerに配列を渡す
- 4. 別のクラスのスレッドからラベルフォームを変更する
- 5. フォームオブジェクトのプロパティを別のクラスから変更する
- 6. 別のクラスからuilabelを変更する方法
- 7. ViewControllerからUITabldeviewコントローラに変更するには?
- 8. アクションのCCスピードを別のクラスから変更しますか?
- 9. IOS 5 - 別のViewControllerからViewControllerを呼び出す
- 10. 別のViewController(コアデータ)から 'エンティティ'にアクセス
- 11. 1つのViewControllerから別のViewControllerにオブジェクトにアクセスする方法
- 12. ViewControllerとViewControllerのどちらに配置するコードを選択するには?
- 13. 別のクラスの別のスレッドからUIを更新する
- 14. TabBarItemのViewControllerを変更する
- 15. UIView全体を1つのViewControllerから別のViewControllerにUINavigationController経由で渡す
- 16. C#別のクラスからTextBoxを更新
- 17. 別のViewControllerでViewControllerのインスタンスを識別する
- 18. 中央セントラルディスパッチを使用している別のDataControllerクラスからViewControllerクラスのUITableViewを取り込みます。
- 19. viewcontrollerのサイズ変更 - iphone sdk
- 20. ViewController向きの変更
- 21. 親ViewControllerクラスのプロパティ値を子ViewControllerから設定していますか?
- 22. PHP - クラス変数/関数をクラス外から変更する
- 23. 私は別のviewControllerからtableViewを更新したいと思いますか?
- 24. NSMutableArrayを別のViewControllerクラスに渡す方法
- 25. 別のクラスから変数を取得
- 26. SQLHelperクラス - は、ExecuteNonQueryコード変更
- 27. モーダルビューから別のViewControllerに移動する
- 28. 別のクラスの中にあるクラスからインスタンス変数にアクセスするには
- 29. 以前のViewControllerからオブジェクトを更新するには?
- 30. メインのViewControllerから別のUIViewを直接ロードする
はい、NSNotificationCenter。 viewWillAppear()またはViewWillDisappear()が呼び出されると、オブザーバが作成および割り当て解除されることを理解します。そうすることで、私が外に出たときにオブザーバのメモリを解放することができます。 ARCが有効な場合、dealloc()は使用できません。 –
deallocはARCの世界ではまったく正当ですが、使用方法は微妙に変更されています。詳細は[dealloc](https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/index.html#//apple_ref/occ/instm/NSObject/dealloc)を参照してください。基本的に、限られたリソースの管理には使用せず、superを呼び出さないでください。 – Michael
viewWillDisappear()およびviewWillAppear()がコードを破損する状況を記述できますか。私はこれらのメソッドを使用してオブザーバを追加または削除することを提案したリンクをいくつか調べました。ここをクリック:[Link1](http://www.daveoncode.com/2011/12/12/quick-ios-tip-where-is-the-right-place-to-add-and-remove-observers-in -uiviewcontrollers /)、[Link2](http://stackoverflow.com/questions/10631375/whats-the-better-way-to-addobserver-removeobserver-with-nsnotificationcenter)を参照してください。 –