从另一个 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 类调用方法时,Xcode 找到一个 nil 变量,其中不应该是任何变量