我有一个带有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
答案 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。
希望这有帮助。