我认为这是一个非常简单的问题,但解决方案已经逃过了我。我有一个UITabBarController应用程序。有两个视图,我将它们称为A和B.当然,我有一个初始化标签栏的AppDelegate类。
View B有一个名为clearScore的按钮:按下时,视图B需要直接或间接调用clearScore:在视图A上。有人可以告诉我实现这一目标的步骤吗?谢谢你的帮助!
答案 0 :(得分:2)
您可以使用Notifications或Key-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];
}
}