访问另一个视图控制器中的实例方法

时间:2011-01-06 00:59:48

标签: iphone methods uiviewcontroller instance

我有一个带有4个标签的标签栏控制器。每个选项卡都有自己的视图控制器和UIWebView。

假设我在vc1中有一个按钮(button1),在onClick1上也有一个实例方法。在vc2中,我有一个名为reload的方法。我的问题是,如何从vc1访问vc2中的特定实例方法onClick1?

有关详细信息,我实际上是在尝试为iPhone编写一个简单的购物实用程序。当用户从浏览视图向购物车添加商品时,我希望能够自动重新加载购物车视图。

以下是我的意思的一些例子。这个问题比我想象的要困难得多。我不确定我是否重新设计了我的应用程序或者是什么。也许vc1和vc2都属于vcmain的子类,并且每个都引用了它们?但是,如果我这样做,那么我如何将它们引用到相应的.xib?谢谢你们!

@implementation viewController 1

//Reloads vc2
-(IBAction) onClick1: (id) sender {

 //Calls vc2 reload
 [vc2 reload];
 }

@end

@implementation viewController 2

//Reload View
-(void)reload {
  [webView reload];
}

@end

2 个答案:

答案 0 :(得分:1)

答案 1 :(得分:0)

我认为您应该已经拥有类似基础UIViewController(让我们称之为MyTabBars)的内容,其UITabBarController *tabBarController包含所有标签栏视图控制器。如果听起来很熟悉,您需要MyTabBars中名为-(void)reloadCart的方法。 reloadCart将遍历tabBarController.viewControllers的数组。在每个viewController上,您可以执行respondsToSelector:@selector(reload),如果特定viewController符合条件,则会调用该选择器方法。

为了做到这一点,您可能希望所有vc1,vc2,...文件都定义并合成id delegate。当MyTabBars创建不同的标签栏时,它会将vc1和vc2 delegate设置为self

@implementation MyTabBars

//Reload Cart View
-(void)reloadCart {
  for (UIViewController *thisUIViewController in tabBarController.viewControllers){
     if ([thisUIViewController respondsToSelector:@selector(reload)]) {
         [thisUIViewController reload];
     }
  }
}

@end

假设您知道如何将MyTabBars的委托传递到您的vc1和vc2,那么您现在可以在vc1中拥有以下代码:

@implementation viewController1

//Reloads vc2
-(IBAction) onClick1: (id) sender {

 //Calls MyTabBars reloadCart which will look for all tab bar view controllers
 //that have the 'reload' method
 [delegate reloadCart];
 }

@end

此解决方案的想法将导致MyTabBars触发任何标签栏视图控制器中的任何reload方法。因此,请注意在vc1,vc2等文件中命名此类方法。此解决方案将根据您的命名约定使用相同的方法触发唯一的vc方法或多个vcs。

希望这有帮助。