UITabBarController应用程序 - 如何在控制器之间调用方法?

时间:2011-04-03 21:05:55

标签: objective-c xcode delegates interface-builder uitabbarcontroller

我认为这是一个非常简单的问题,但解决方案已经逃过了我。我有一个UITabBarController应用程序。有两个视图,我将它们称为A和B.当然,我有一个初始化标签栏的AppDelegate类。

View B有一个名为clearScore的按钮:按下时,视图B需要直接或间接调用clearScore:在视图A上。有人可以告诉我实现这一目标的步骤吗?谢谢你的帮助!

4 个答案:

答案 0 :(得分:2)

您可以使用NotificationsKey-Value-Observing (KVO)

假设您有一个属性得分所在的模型对象。现在,在viewController B中将Key-Value-Observer添加到模型实例的score属性中。在A中按clearScore时,将score属性设置为0(或nil)。观察者将告知B该属性已更改,以便您可以轻松更新您的B视图。

答案 1 :(得分:1)

我认为有一种更简单的方法可以实现:

你可以在bViewController中使用类似下面的代码:

for (UIViewController* testViewController in self.tabBarController.viewControllers) {
    if ([testViewController respondsToSelector:@selector(clearScore)]) {
        [(aViewController *)testViewController clearScore];
    }
}

或者:

for (UIViewController* testViewController in self.tabBarController.viewControllers) {
    if ([testViewController isKindOfClass:[aViewController class]]) {
        [(aViewController *)testViewController clearScore];
    }
}

不要忘记bViewController标题中的#import "aViewController.h";

答案 2 :(得分:0)

视图应该只与他们自己的控制器直接对话,控制器不应该与自己的视图对话。如果视图控制器B的一个按钮应该导致消息被发送到视图控制器A,则该按钮应该在控制器B中触发一个动作,该动作又向A发送消息。

然而,-clearScore:听起来像是一个模型的一部分,而不是控制器的一部分,而B有兴趣的事实进一步证明了这一点。您可能想要考虑重构一下代码。

答案 3 :(得分:0)

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
    //other codes

    [self.tabBarController setDelegate:self]

    //other codes
    }

// UITabBarControllerDelegate method.
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController
{
    if ([viewController respondsToSelector:@selector(reloadDataTemp)]) {
        [(YourViewController *)viewController reloadData];
    }
}