我有一个应用程序,其中有两个基本功能,通过在UITabBarController上的单独选项卡上描绘。每个选项卡都有一个特定的按钮,按下该按钮时,作为其正常活动的单独功能,还应异步告知其他选项卡以使其数据为零。如何从另一个选项卡访问一个选项卡?
答案 0 :(得分:2)
这对通知很有用(如NSNotification
,而非本地或推送通知)。
每个选项卡中的每个视图控制器都应该有某种模型。每个模型都可以在注册另一个模型时发布其通知。这样,视图控制器或模型都不需要直接了解对方。
当用户点击按钮时,视图控制器会告知其模型发布其通知。另一个将收到通知并采取相应行动。
有关详细信息,请参阅NSNotificationCenter
和NSNotification
的文档。
答案 1 :(得分:1)
// 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对象中的每一个都可能访问应用程序中的某些数据。
答案 2 :(得分:1)
您可以从TabBarController的viewControllers
属性访问每个viewControllers,并遍历它们。除了现场之外的所有人都归零(自我)。
将其放入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
发送给其他人...
答案 3 :(得分:0)
您的标签是核心数据驱动的吗?如果您使用NSFetchedResultsController,则可以通过NSFetchedResultsControllerDelegate协议免费获得通知。否则,像rmaddy这样的NSNotification建议。