4

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

我试图像这样在 viewWillAppear 中调用 viewDidLoad ...

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

它可以工作,但它仍然在堆栈上加载 VC1,用户可以看到更改(不好)。

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

4

2 回答 2

11

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

  • 在 VC1中创建一个新函数/方法(命名为viewLoadSetup)并将所有代码从.viewDidLoad()viewLoadSetup()
  • 现在,viewLoadSetup()viewWillAppear

    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
         }
    
    
    }
    


如果你想调用一次,当你viewLoadSetupviewDidLoad视图控制器被加载时,然后每次从你的viewWillAppearthen 之后,

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
    }


}
于 2017-10-05T03:52:01.973 回答
1

您可以使用 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()
}
于 2017-10-05T03:28:25.560 回答