我有一个应用程序,其中有两个基本功能,通过在 UITabBarController 上的单独选项卡上进行描述。每个选项卡都有一个特定的按钮,当按下该按钮时,它应该作为其正常活动的一个单独功能,也异步告诉另一个选项卡将其数据归零。如何从另一个选项卡访问一个选项卡?
4 回答
这将是通知的一个很好的用途(例如NSNotification
,不是本地或推送通知)。
每个选项卡中的每个视图控制器都应该有某种模型。每个模型都可以在注册另一个模型时发布其通知。这样,视图控制器或模型都不需要直接了解对方。
当用户点击一个按钮时,视图控制器告诉它的模型发布它的通知。另一个将收到通知并采取相应措施。
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,但发送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 对象中的每一个都可能可以访问应用程序中的某些数据。
Are your tabs core-data driven? If you use a NSFetchedResultsController then you get notifications for free through the NSFetchedResultsControllerDelegate protocol. Otherwise, NSNotification like rmaddy suggests.