从Tab Bar Controller中的SecondView刷新FirstView

时间:2017-08-10 06:08:56

标签: ios swift

我的应用正在使用Tab Bar Controller,其中包含多个View Controller在不同的标签中。当用户打开应用程序时,他们将首先进入FirstView。我想在SecondView中放一些刷新FirstView的方法。这是我的FirstViewController.swift

class FirstViewController: UIViewController, UIScrollViewDelegate {

    override func viewDidLoad() {

        super.viewDidLoad()

我试图把

FirstViewController().viewDidLoad()

在我的SecondViewController.swift中,但这不起作用。有没有更好的方法来刷新FirstView?

4 个答案:

答案 0 :(得分:2)

通过创建firstViewController的静态引用尝试这种方式然后通过此引用可以调用任何函数

class ViewController: UIViewController {
        static var firstVC : ViewController?
        override func viewDidLoad() {
            super.viewDidLoad()
            print("m on FirstViewController ")
            ViewController.firstVC = self
        }
}

class SecondViewController: UIViewController {

        override func viewDidLoad() {
            super.viewDidLoad()
            print("m on SecondViewController ")
           ViewController.firstVC?.viewDidLoad()
        }

}

答案 1 :(得分:1)

你可以试试这个: - 而不是0传递您的FirstViewController的索引

if let firstVC = self.tabBarController?.viewControllers?[0] as? FirstViewController {
       firstVC.viewDidLoad()
}

答案 2 :(得分:0)

您不应该自己调用viewDidLoad。加载视图时只调用一次。

如果要在显示控制器视图之前更新控制器视图,可以使用viewWillAppear更改布局或任何您想要执行的操作。

答案 3 :(得分:0)

你正在与它争论如何告诉另一个视图控制器它需要更新其视图的问题。为此,您有两个可能的解决方案,因为有效地,您正在确定在不同对象之间进行通信的最佳方式。

通知松散地脱钩,往往对一对多关系有用。一个对象可以触发通知,一个或多个对象可以监听该通知。在您的情况下,当某个状态在一个视图控制器中发生更改时,可以广播通知,而另一个视图控制器可以观察该通知,以便在应该更改时通知它。

代表的关系更紧密,因为它们是一对一的。它们通常通过在符合某些协议的对象上创建委托属性来实现。然后,另一个对象将该委托属性分配给自身并实现协议,以便只要在委托上调用该函数,就会调用其实现。在您的情况下,每个视图控制器都可以具有某些协议的委托属性。选项卡栏控制器可以将委托属性分配给自身并处理这些功能的实现。因此,只要发生更改并调用委托,标签栏控制器就可以负责告诉哪些视图控制器更新其视图。

当然,还有其他方法可以处理您的情况,例如更新viewWillAppear中的视图。这样,只要屏幕上出现视图控制器,就会执行一些代码来更新其视图。

它最终取决于您如何存储应用程序状态和应用程序的设计。