【问题标题】:self.tabBarController.selectedIndex not calling viewDidAppearself.tabBarController.selectedIndex 不调用 viewDidAppear
【发布时间】:2019-01-25 03:41:46
【问题描述】:

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

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

使用按钮时,我可以很好地导航到选项卡,但没有调用 viewDidAppear。

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

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

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

这是结构的截图:

感谢您对此提供的任何帮助!

“当前”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

    }
}

在我的目标视图控制器中:

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

【问题讨论】:

  • 你检查过 tabBarController 是否为 nil 吗??
  • @JarvisTheAvenger 我刚刚检查过,它不是零
  • 你能分享更多代码还是只是你的导航结构。
  • 尝试在视图中查看会出现视图控制器生命周期的方法。
  • @JarvisTheAvenger 好主意,我添加了一个 viewWillAppear 方法,它确实被调用了,但是 viewDidAppear 没有......知道为什么会这样吗?

标签: swift uitabbarcontroller viewdidload


【解决方案1】:

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

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

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

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

【讨论】:

  • 这很好,感谢您抽出宝贵时间。我的问题有一个错字,我的意思是问如何让 viewDidAppear 工作......在我发布的代码中,我有我的 viewDidAppear 代码,但是当我使用 self.tabBarController.selectedIndex = 0 时它没有被调用。有吗我还需要什么来完成这项工作吗?一些解决方案谈到了 UITabBarController 的子类,但我也没有运气。
  • @TJMac 你能把一些代码放在你调用它的地方吗?
  • 好的,我刚刚更新了更多代码以显示上下文。我的 HomeVC 有很多代码,所以我简化了代码以保持它的整洁。让我知道是否还有比我添加的更多要考虑的内容。再次感谢!
【解决方案2】:

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

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

注意:在UITabbarController 的情况下,始终执行您的 UI 更新任务和 API 调用任务 viewWillAppearviewDidAppear

【讨论】:

  • 我刚刚更新了我的帖子,我为我的标签栏控制器添加了自定义类... viewWillAppear 正在被调用,但我认为它为时过早,因此代码不会执行。我认为这会发生,这就是为什么我希望它出现在 viewDidAppear 中。该方法没有被调用..我不知道为什么
  • 它似乎应该 b/c 我能够打印到控制台,但我正在调用的函数没有被执行。我认为这与时间有关,所以我现在正在调试以查看它在哪里中断。但我仍然不明白为什么 viewDidAppear 不起作用。
  • 更新:所以我在 viewWillAppear 调用中添加了一点延迟,它们都可以正常工作。这不是一个理想的解决方案,所以我仍然要努力找出为什么 viewDidAppear 没有被调用。
  • 我最终删除了我的故事板引用并重新连接它们以取回 viewDidAppear 方法......不确定是什么坏了或在哪里,但你的答案和 cmets 帮助了大量的调试。再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-16
  • 2012-07-16
  • 2012-08-26
  • 2019-04-10
  • 1970-01-01
相关资源
最近更新 更多