从另一个 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 的实例方法的主要内容,如果未能解决你的问题,请参考以下文章

从另一个 .swift 文件调用 ViewController 函数

UIWebView 在从另一个 ViewController 调用的方法中为 null

快速从另一个 ViewController 调用函数

当从另一个 ViewController 类调用方法时,Xcode 找到一个 nil 变量,其中不应该是任何变量

使用 UIView 中的按钮从另一个 ViewController 触发方法

快速从另一个访问 Viewcontroller 的实例