self.tabBarController.selectedIndex不调用viewDidAppear

时间:2019-01-25 03:41:46

标签: swift uitabbarcontroller viewdidload

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

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

使用该按钮时,我可以很好地导航至选项卡,但是未调用viewDidAppear。

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

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

更新:调用了我添加的viewWillAppear方法,但是我必须在函数中添加一个延迟才能使它们工作,这有点笨拙,并不理想。不确定为什么viewDidAppear无法使用:(

这是该结构的屏幕截图: enter image description here

我非常感谢您对此提供的帮助!

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

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

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

2 个答案:

答案 0 :(得分:3)

使用UITabBarController时,viewDidLoad方法仅在内存中装入任何UIViewController时才调用一次。之后,当您浏览相同的UIViewController时,它将从内存中加载。

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

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

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

答案 1 :(得分:1)

对于UITabBarController viewDidLoad仅被调用一次。并且您的viewWillAppearviewDidAppear被多次呼叫。您可以检查是否致电viewWillAppear。因为您的视图将在viewDidAppear之前被调用,就像进行反向工程过程一样。

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

  

注意:对于UITabbarController,请始终执行用户界面更新任务和API调用任一任务   viewWillAppearviewDidAppear