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

Posted

技术标签:

【中文标题】使用标签栏从另一个视图返回时如何重新加载视图控制器【英文标题】: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 中调用它。或者请提供更多信息,以便我提供更多帮助。 【参考方案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()

【讨论】:

以上是关于使用标签栏从另一个视图返回时如何重新加载视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

使用标签栏控制器离开视图时如何关闭视图

如何通过iOS Objective C中的appDelegate从另一个视图控制器重新加载表视图

当我从另一个视图控制器调用时,为啥我的表视图为零?

如何在使用 UIpageviewcontroller 导航页面时从另一个视图控制器自动更新视图控制器上的标签

从另一个视图重新加载表视图

如何从另一个 UIViewController 重新加载 UITableViewController