UITabBarControllerの別々のタブにあることで表される2つの基本的な関数があるアプリがあります。各タブには特定のボタンがあり、押すと、通常のアクティビティとは別の機能として、他のタブにもデータをゼロにするように非同期で指示する必要があります。あるタブから別のタブにアクセスするにはどうすればよいですか?
4 に答える
これは通知に適しています(NSNotification
ローカル通知やプッシュ通知ではありません)。
各タブのビューコントローラごとに、ある種のモデルが必要です。各モデルは、他のモデルの登録中に通知を公開できます。このように、ビューコントローラもモデルも実際に相手を直接知る必要はありません。
ユーザーがボタンをタップすると、ViewControllerはモデルに通知を公開するように指示します。もう1つは通知を受け取り、それに応じて行動します。
詳細については、ドキュメントを参照しNSNotificationCenter
てNSNotification
ください。
TabBarControllerのviewControllers
プロパティから各viewControllerにアクセスし、それらを反復処理できます。ライブのもの(自己)以外はすべてゼロにします。
非同期性のためにGCDディスパッチキューに入れます。
- (IBAction)pushButton:(id)sender {
NSLog (@"%@ %@",self,NSStringFromSelector(_cmd));
//do normal stuff here
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
for (id viewController in [[self tabBarController] viewControllers]) {
if ((viewController != self)
&& ([viewController respondsToSelector:@selector(zeroData)])) {
[viewController performSelector:@selector(zeroData)];
}
}
});
}
- (void) zeroData
{
NSLog (@"%@ %@",self,NSStringFromSelector(_cmd));
//each view controller should zero out it's own data
//in a method called "zeroData"
}
これを試してログを見ると、現在のvcはそのままで、他のvcに送信zeroData
されていることがわかります...
UITabBarControllerの「タブ」の定義
// define controllers for each tab
UIViewController *viewController1 = [[UIViewController alloc] init];
UIViewController *viewController2 = [[UIViewController alloc] init];
// define tab bar controller, "self" is a UITabBarController
self.viewControllers = [NSArray arrayWithObjects: viewController1, viewController2, nil];
この時点から、特定のタブにアクセスする必要がある場合は、「viewController1」または「viewController2」オブジェクトを介してアクセスする必要があります。これらのUIViewControllerオブジェクトのそれぞれは、おそらくアプリケーション内の特定のデータにアクセスできます。
タブはコアデータ駆動型ですか?NSFetchedResultsControllerを使用する場合は、NSFetchedResultsControllerDelegateプロトコルを介して無料で通知を受け取ります。そうでなければ、rmaddyのようなNSNotificationが示唆します。