从另一个 ViewController 调用一个 ViewController 的实例方法

Posted

技术标签:

【中文标题】从另一个 ViewController 调用一个 ViewController 的实例方法【英文标题】:Calling instance method of one ViewController from another ViewController 【发布时间】:2012-12-21 07:45:35 【问题描述】:

我意识到这个问题已经被问死了,在过去的几年里,至少每月一次在 *** 上,但我仍然找不到解决方案。

我有两个来自 UITabBarController 的 ViewController。两者都通过情节提要进行初始化。我正在尝试从另一个调用一个 VC 的方法。当然是实例方法。

我听说过以下几种可能性:

1: NSNotifications

2:定义协议并将一个 VC 声明为另一个 VC 的委托。

3:实际上是通过RootViewController调用方法。

我的代码通过 NSNotifications 工作,但我不喜欢这个概念,我想了解正确的方法。我最感兴趣的是可能性(3),然后是(2)作为最后的手段。

我试图让 (2) 工作几个小时,但没有从其他 VC 初始化委托 VC,我很难过。 (由于故事板,不是一个选项)。

(2)或(3)是否可能?怎么样?

如果两者都不可能,我对首选 ios 架构的误解是什么?

【问题讨论】:

【参考方案1】:

是的,3 是可能的。假设您有两个 UIViewController 类,FooViewController(标签索引 0)和 BarViewController(标签索引 1)。假设您想从BarViewController 调用FooViewController-(void)doFoo 方法。

BarViewController,做[(FooViewController *)[self.tabBarController.viewControllers objectAtIndex:0] doFoo]

【讨论】:

啊好吧,几乎可以了。万分感谢!我忘了提到 FooViewController 隐藏在 UINavigationController 后面。对不起,我忘了把它放在我原来的帖子里。您能否根据这种情况编辑代码? image.bayimg.com/4877ae4d46dbdae21701f4648b51fcbe08e14c76.jpg(故事板屏幕截图) 我将把它作为练习留给读者 =) 提示:[self.tabBarController.viewControllers objectAtIndex:0].viewControllers 将为您提供UINavigationController 中的 VC 数组。 hm...它的抱怨:当我尝试 NSLog 数组时,在“id”类型的对象上找不到属性“viewControllers”... 所以我重新初始化了导航控制器...让我们看看会发生什么: UINavigationController *navController = [self.tabBarController.viewControllers objectAtIndex:0]; [(homeViewController *) [navController.viewControllers objectAtIndex:0] updateLabelsToMetric:metricSwitch.on];【参考方案2】:

我想使用 NSNOtification 并不总是做类似事情的错误方法。我也为这个概念而苦苦挣扎。

对于这个场景,我认为通知还可以:

    你有一个包含控制器 A 和 B 的 tabbarcontroller 控制器 A 是一些对象的列表,例如书籍。 控制器 B 是控制器,您可以通过填写表格并单击提交来创建书籍 然后控制器 A 更新其列表。

原因是Controller A的更新不是“点击提交”。它刷新是因为创建了一本书。这是关于数据的东西。不知何故,“一本书被创建”是应用程序中的一个关键事件。

换一个senario就不行了

    你有一个包含控制器 A 和 B 的 tabbarcontroller 控制器 A 的中心有一个 ViewC 控制器B有一个按钮,当它被点击时,ViewC上移

这只是我个人的看法。

【讨论】:

以上是关于从另一个 ViewController 调用一个 ViewController 的实例方法的主要内容,如果未能解决你的问题,请参考以下文章