加速時にView Controllerからview-change-operationsをアウトソーシングするにはどうすればよいですか?
-
05-07-2019 - |
質問
View Controllerクラスがあります。加速度計が動きを検出し、デリゲートオブジェクトのaccelerometer:didAccelerate:メソッドを呼び出すときに、ビューでいくつかのことを行いたいと思います。
このデリゲートオブジェクトは、私の脳の問題です。現在、私の脳はフリーズしているので、何が良いかわかりません。ご意見をお聞かせください!
ソリューション1) 私のView Controllerクラスでは、UIAccelerometerDelegateプロトコルに準拠し、そのaccelerometer:didAccelerate:メソッドを実装しています。 AppDelegateクラスの-applicationDidFinishLaunching:メソッドで、加速時にメソッド呼び出しを受信するためのデリゲートとして、そのビューコントローラーオブジェクトを設定しました。それはあまり良くないと思います。
ソリューション2) AccelerationDelegateという名前の空の新しいオブジェクトを作成し、そのUIAccelerometerDelegateプロトコルに準拠し、そのaccelerometer:didAccelerate:メソッドを実装し、AppDelegateクラスの-applicationDidFinishLaunching:メソッドに、ビューコントローラーオブジェクトを、加速時にメソッド呼び出しを受け取るためのデリゲートとして設定します。
しかし、ソリューション2の場合、私の脳は少し立ち往生しました!そのオブジェクト内のView ControllerからViewオブジェクトにどのようにアクセスしますか?
ここでの問題は、複数のView Controllerがあることです。 Tab Bar Controllerを使用してそれらを切り替えます。
どのようにそれを正しくすることができますか?
解決
アクセラレーションが1つのView Controllerに固有の場合、View Controllerが自身のサブビューを変更するために必要な情報を受け取るようにすることは理にかなっています。ただし、ビューが表示されたらデリゲートにView Controllerを設定し、表示されなくなったらデリゲートをnullに設定する方が良い場合があります。 (具体的には、-(void)viewWillAppear:
および-(void)viewWillDisappear:
)
他のヒント
2番目の方法の方が良いことに同意します。現在選択されているタブビューのみにアクセスしようとしていますか、それともアプリの特定のビューのみにアクセスしようとしていますか。
いずれにしても、私がすることは、 UIApplicationDelegate
で UITabViewController
のプロパティを設定して、デリゲートからアクセスできるようにすることです( [[UIApplication sharedApplication] delegate]
)を呼び出してアプリのデリゲートを行います。例:
YourApplicationDelegate *appDelegate = (YourApplicationDelegate *)[[UIApplication sharedApplication] delegate];
FirstUIViewController *firstViewController = appDelegate.firstViewController;
[firstViewController doStuff];
firstViewController
はデリゲートのプロパティです。