self.tabBarController.selectedIndex 没有调用 viewDidAppear

self.tabBarController.selectedIndex not calling viewDidAppear

我一直在查看并尝试其他人针对此问题发布的所有解决方案,但我仍然没有得到它。

我的用例非常简单。我有一个带按钮的 viewController,当按下该按钮时,我想导航到另一个选项卡并重新加载数据,包括 api 调用。

使用按钮时,我可以正常导航到选项卡,但未调用 viewDidAppear。

如果在另一个选项卡上,并使用选项卡栏导航,viewDidAppear 工作正常。 viewWillAppear 也在工作,但我必须为我想调用的函数添加一个手动延迟,所以它并不理想。

那么我需要做什么才能使用 self.tabBarController.selectedIndex = 0 进行导航并获得 viewDidAppear 的功能?

更新: 我添加的 viewWillAppear 方法被调用,但我必须为我的函数添加延迟才能使它们工作,而且它有点笨拙,不理想。不确定为什么 viewDidAppear 不起作用:(

这是结构的屏幕截图:

非常感谢您对此的帮助!

"current" ViewController 是我的标签索引 2:

import UIKit

class PostPreviewVC: UIViewController {

//Here I create a post object and post it to the timeline with the below button

    @IBAction func postButtonPressed(_ sender: Any) {

    //create the post via Firebase api

    self.tabBarController?.selectedIndex = 0

    }
}

在我的目的地viewController:

import UIKit
import Firebase
import SDWebImage
import AVFoundation

class HomeVC: UIViewController {

// MARK: - PROPERTIES

var posts = [Post]()
let refreshControl = UIRefreshControl()
//more properties...


@IBOutlet weak var tableView: UITableView!

override func viewDidLoad() {
    super.viewDidLoad()

    setupUI()
    configureTableView()
    reloadTimeline()

    UserFirebase.timeline { (posts) in
        self.posts = posts
        self.tableView.reloadData()
    }
}

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

    print("viewDidAppear")

    _ = self.view
    setupUI()
    configureTableView()
    reloadTimeline()

    UserFirebase.timeline { (posts) in
        self.posts = posts
        self.tableView.reloadData()
    }
}

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

    print("viewWillAppear")

    DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
        self.reloadTimeline()
        self.configureTableView()
    }
}

//All the tableview code below here...
}

为我的标签栏控制器添加了自定义 class:

import UIKit

class TabBarController: UITabBarController, UITabBarControllerDelegate {

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.
}

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

    print("viewDidAppear in tabBar custom Class called")
}

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

    print("viewWillAppear in tabBar custom Class called")
}
}

当您使用 UITabBarController 时,方法 viewDidLoad 只会在内存中加载任何 UIViewController 时调用一次。之后,当您导航相同的 UIViewController 时,它将从内存中加载。

为了克服这个问题,您必须将代码分成 viewDidLoad & viewDidAppear。因此,在 viewDidLoad 中,您只需在整个应用程序中放置要初始化一次的代码,例如添加 UIView 或其他内容,而在 viewDidAppear / viewWillAppear 中,您可以进行 API 调用或一些获取动态数据的函数。

最后,当您调用 self.tabBarController.selectedIndex = 0 时,它只会调用 viewDidLoad 一次,并且每次您导航 UIViewController 时都会调用 viewDidAppear / viewWillAppear ].

希望这有助于理解 UITabBarController 的工作原理。

对于 UITabBarController viewDidLoad 只调用一次。你的 viewWillAppearviewDidAppear 被多次调用。您可以检查您的 viewWillAppear 是否被调用。因为您的视图会在 viewDidAppear 之前被调用,这就像经历逆向工程过程一样。

您还可以将 viewDidAppear 方法添加到您的 UITabBarController 自定义 class 中。并以这种方式调用它的 superclass 方法,我认为它会解决你的问题。

Note: In the case of UITabbarController, Always do your UI update task and API calling a task in either viewWillAppear or viewDidAppear