使用标签栏从另一个视图返回时如何重新加载视图控制器

How to reload a view controller when back from another view using tab bar

我有一个用户打开应用程序(VC1)时使用的通用视图。使用选项卡栏控制器,我加载了另一个视图 (VC2),可用于更新前一个视图中可见的数据。当我返回 VC1(堆栈)时,它不会重新加载更新的数据。

我试过像这样调用 viewWillAppear 中的 viewDidLoad...

override func viewWillAppear(_ animated: Bool) {
    viewDidLoad()
}

它有效,但它加载了仍在堆栈上的 VC1,用户可以看到变化(不好)。

我想关闭 VC1 会有所帮助,但我还没有找到如何在使用标签栏控制器时关闭视图。

您可以在 VC2 中使用块来回调 VC1 以重新加载某些内容。
首先,在VC2中,声明一个块:

class View2Controller: UIViewController {

    public var completionHandler:(()->Void)?
    //...
}

其次,返回前在VC2中回调:

self.completionHandler?()

终于,在VC1中,你可以被回调重新加载:

let vc2 = View2Controller()
vc2.completionHandler = { [weak self] () -> Void in
    //call reloading method like: self?.reloadData()
}

每次您的视图出现时,请按照以下步骤处理您的视图加载设置:
(VC1 = 第一个视图控制器)

  • 在您的 VC1 中创建一个新的 function/method(名为 viewLoadSetup)并将所有代码从 viewDidLoad() 移动到 viewLoadSetup()
  • 现在,从 viewWillAppear

    呼叫 viewLoadSetup()
    class VC1: UIViewController {
    
        override func viewDidLoad() {
           super.viewDidLoad()
           // viewLoadSetup()  you may call it from view did load also
        }
    
        override func viewWillAppear(_ animated: Bool) {
           super.viewWillAppear(animated)
           viewLoadSetup()
    
        }
    
    
         func viewLoadSetup(){
          // setup view did load here
         }
    
    
    }
    


如果您想从 viewDidLoad 调用 viewLoadSetup 一次,当您的视图控制器加载时,然后在每次从您的 viewWillAppear 调用之后,

class VC1: UIViewController {

    var isLoadingViewController = false

    override func viewDidLoad() {
        super.viewDidLoad()
        isLoadingViewController = true
        viewLoadSetup()
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        if isLoadingViewController {
            isLoadingViewController = false
        } else {
            viewLoadSetup()
         }
    }


    func viewLoadSetup(){
      // setup view did load here
    }


}