iOS标签相互通话

时间:2013-03-18 22:03:14

标签: ios tabs

我有一个应用程序,其中有两个基本功能,通过在UITabBarController上的单独选项卡上描绘。每个选项卡都有一个特定的按钮,按下该按钮时,作为其正常活动的单独功能,还应异步告知其他选项卡以使其数据为零。如何从另一个选项卡访问一个选项卡?

4 个答案:

答案 0 :(得分:2)

这对通知很有用(如NSNotification,而非本地或推送通知)。

每个选项卡中的每个视图控制器都应该有某种模型。每个模型都可以在注册另一个模型时发布其通知。这样,视图控制器或模型都不需要直接了解对方。

当用户点击按钮时,视图控制器会告知其模型发布其通知。另一个将收到通知并采取相应行动。

有关详细信息,请参阅NSNotificationCenterNSNotification的文档。

答案 1 :(得分:1)

UITabBarController的“tabs”定义

// 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建议。