2011-01-06 184 views
0

我有一个带有4个选项卡的选项卡栏控制器。每个选项卡都有自己的视图控制器和一个UIWebView。在另一个视图控制器中访问实例方法

比方说,我有一个VC1按钮(按钮1)和一个实例方法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 

回答

0

我想你应该已经有类似的基UIViewController(姑且称之为MyTabBars)具有包含所有标签栏视图控制器一个UITabBarController *tabBarController。如果听起来很熟悉,您需要一个名为-(void)reloadCart的方法MyTabBarsreloadCart将步行tabBarController.viewControllers阵列。在每个viewController上,您可以执行respondsToSelector:@selector(reload),如果具体的viewController合格,则它会调用该选择器方法。

为了做到这一点,你可能希望所有的VC1,VC2,...文件有一个id delegate定义和合成。当MyTabBars创建不同的标签栏时,它将vc1和vc2设置为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。

希望这会有所帮助。

1

你基本上有三种方法,其中每一个都有加分和短处。我将给你一个高层次的概述,并让你转到Apple非常全面的文档以获取详细信息。希望我可以给你正确的条款谷歌更具体的帮助。

@dredful相当巧妙的细节是有办法处理“其他”视图控制器和直接调用方法。这很好,但它可能会让人困惑和麻烦,将指针指向所有的控制器,并遍历视图层次结构以获取想要的控制器确实非常棘手。

第二种方法是键 - 值观察。您可以注册一个视图控制器来“观察”另一个视图控制器的特定键(命名属性),并在发生各种事情时触发特定的选择器。虽然在某些时候你必须同时指向两个控制器,但这并不能完全缓解上述“直接调用它”方法的缺点,这有点神奇而且很好。这也是视图控制和数据的一种不幸偶合,MVC的中断类型。

第三种方法是使用NSNotificationCenter的。一个类可以发布通知,并且任何其他注册自己的对象都可以在发生这种情况时触发该通知。这很好,因为你可能有很多不同的对象将物品添加到购物车,并且他们可以仅仅向通知中心发送一张纸条(即使将物品或任意数据传递给它),并且购物车视图可以使用这些通知,抓住通过的物体,做它的事情,而不是关心特别是谁在跟它说话。它使应用程序的各个部分保持良好的分离。缺点是,它有一些开销,并且无论选择通知的消耗类是否同步执行,都无法隐藏网络活动或其他一些长时间过程。

相关问题