【问题标题】:How to reload a view controller when back from another view using tab bar使用标签栏从另一个视图返回时如何重新加载视图控制器
【发布时间】:2017-10-05 03:04:40
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 永远不要自己调用viewDidLoad 或任何其他视图控制器生命周期方法。
  • 您应该创建一个函数来刷新数据并从 viewWillAppear 调用它
  • 创建一个加载数据的函数,并在 viewWillAppear 和 ViewDidLoad 中调用它。或者请提供更多信息,以便我提供更多帮助。

标签: ios swift uiviewcontroller uitabbarcontroller loadview


【解决方案1】:

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

  • 在您的 VC1 中创建一个新函数/方法(命名为 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
    }


}

【讨论】:

  • 感谢@Krunal,现在视图正在加载。但是我还是有VC1以前版本的问题。在 VC2 中,当用户点击标签栏控制器的图标时,VC1 会立即显示,他可以看到旧数据和动画在 VC1 的先前版本上进行。你知道如何在重新加载之前关闭 VC1 吗?我试过`self.presentedViewController?.dismiss(animated: true, completion: nil)`但没有成功。再次感谢。
  • for animation going over the previous version of VC1. Do you know how to dismiss the VC1 before reloading? 使用 viewDidAppear 动画。
  • for the previous version of the VC1. When, in VC2, the user tap on the icon of the tab bar controller, the VC1 shows instantly and he can see old dataviewWillAppear 中隐藏您的视图,并在数据重新加载完成后再次取消隐藏。分享您的视图控制器代码结构。所以我可以更好地帮助你
【解决方案2】:

您可以在 VC2 中使用 block 来回调 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()
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-10
    • 2018-12-03
    相关资源
    最近更新 更多