Swift self.tabBarController.selectedIndex不调用ViewDidDisplay

Swift self.tabBarController.selectedIndex不调用ViewDidDisplay,swift,uitabbarcontroller,viewdidload,Swift,Uitabbarcontroller,Viewdidload,我一直在寻找和尝试其他人发布的所有解决方案,但我仍然没有得到它 我的用例非常简单。我有一个带有按钮的viewController,当按下该按钮时,我想导航到另一个选项卡并重新加载包含api调用的数据 使用该按钮时,我导航到选项卡fine,但没有调用ViewDidDisplay 如果在另一个选项卡上,并使用选项卡栏进行导航,则ViewDidDisplay工作正常。VIEWWILLISPEND也在工作,但我必须为我想要调用的函数添加一个手动延迟,所以这并不理想 那么,要使用self.tabBarCo

我一直在寻找和尝试其他人发布的所有解决方案,但我仍然没有得到它

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

使用该按钮时,我导航到选项卡fine,但没有调用ViewDidDisplay

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

那么,要使用self.tabBarController.selectedIndex=0导航并获得ViewDidDisplay的功能,我需要做什么

更新:调用了我添加的viewwillappearch方法,但我必须为函数添加一个延迟,以便它们工作,这有点笨重,不理想。不确定ViewDidDisplay为什么不起作用:(

以下是该结构的屏幕截图:

我非常感谢你在这方面的帮助

“当前”视图控制器是我的选项卡索引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...
}
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")
}
}
为我的选项卡栏控制器添加了自定义类:

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...
}
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")
}
}

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

为了克服这个问题,你必须在
viewdiload
viewdilease
中分割你的代码。因此,在
viewdiload
中,你只需在整个应用程序中放入你想初始化一次的代码,比如添加
UIView
或其他东西,而在
viewdilease
//code>视图中则会出现
,您可以进行API调用或一些获取动态数据的函数

最后,当您调用
self.tabBarController.selectedIndex=0
时,它将只调用一次
viewDidLoad
,并且每当您导航该
UIViewController
时,
viewdide将出现


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

对于
UITabBarController
viewDidLoad
只调用一次。并且您的
视图将出现
viewdidisped
会多次调用。您可以检查
视图是否会出现
会被调用。因为e您的视图将在
视图出现之前出现并被调用,这就像经历反向工程过程一样

您还可以将
viewdide
方法添加到您的
UITabBarController
自定义类中。并将其超类方法调用到自定义类中。我认为这样可以解决您的问题

注意:对于
UITabbarController
,始终执行UI更新任务和API调用任务
视图将出现
视图显示


这很好,谢谢你花时间。我的问题有一个输入错误,我想问如何让ViewDidAspect工作…在我发布的代码中,我有我的ViewDidAspect代码,但当我使用self.tabBarController.selectedIndex=0时,它没有被调用。我还需要做些什么吗?一些解决方案谈到UIT的子类AcCOnter,但我也没有运气。“TJMAC你能把一些代码从你调用这个地方吗?好的,我只是更新了更多代码来显示上下文。我的HooVC有很多代码,所以我简化了它保持干净。让我知道如果有更多的考虑比我所添加的。再次感谢!你检查了TabBar控件吗?r是否为零???@JarvisTheAvenger我刚刚检查过,它不是零。您可以在它上面共享更多代码或只是导航结构。尝试在视图中检查它将显示视图控制器生命周期的方法。@JarvisTheAvenger好主意,我添加了一个viewWillAspect方法,它确实被调用,但viewDidAspect没有…知道为什么会这样吗是吗?我刚刚更新了我的帖子,我为我的选项卡栏控制器添加了自定义类…正在调用viewWillAppear,但我认为这太早了,所以代码无法执行。我认为会发生这种情况,这就是为什么我希望它出现在viewDidAppear中。该方法没有被调用。我很困惑,为什么我可以打印到控件上ole,但我正在调用的函数没有被执行。我认为这与时间有关,所以我现在正在调试,看看它在哪里中断。但我仍然不明白为什么ViewDidAspect不能工作。更新:所以我对ViewWillAspect调用加了一点延迟,它们都能工作。这不是一个理想的解决方案,所以我仍在努力寻找答案为什么没有调用viewDidAppear。我最终删除了我的故事板引用并重新连接它们以获取viewDidAppear方法…不确定是什么坏了或在哪里,但您的回答和评论帮助了大量调试。再次感谢!