Swift self.tabBarController.selectedIndex不调用ViewDidDisplay
我一直在寻找和尝试其他人发布的所有解决方案,但我仍然没有得到它 我的用例非常简单。我有一个带有按钮的viewController,当按下该按钮时,我想导航到另一个选项卡并重新加载包含api调用的数据 使用该按钮时,我导航到选项卡fine,但没有调用ViewDidDisplay 如果在另一个选项卡上,并使用选项卡栏进行导航,则ViewDidDisplay工作正常。VIEWWILLISPEND也在工作,但我必须为我想要调用的函数添加一个手动延迟,所以这并不理想 那么,要使用self.tabBarController.selectedIndex=0导航并获得ViewDidDisplay的功能,我需要做什么 更新:调用了我添加的viewwillappearch方法,但我必须为函数添加一个延迟,以便它们工作,这有点笨重,不理想。不确定ViewDidDisplay为什么不起作用:( 以下是该结构的屏幕截图: 我非常感谢你在这方面的帮助 “当前”视图控制器是我的选项卡索引2:Swift self.tabBarController.selectedIndex不调用ViewDidDisplay,swift,uitabbarcontroller,viewdidload,Swift,Uitabbarcontroller,Viewdidload,我一直在寻找和尝试其他人发布的所有解决方案,但我仍然没有得到它 我的用例非常简单。我有一个带有按钮的viewController,当按下该按钮时,我想导航到另一个选项卡并重新加载包含api调用的数据 使用该按钮时,我导航到选项卡fine,但没有调用ViewDidDisplay 如果在另一个选项卡上,并使用选项卡栏进行导航,则ViewDidDisplay工作正常。VIEWWILLISPEND也在工作,但我必须为我想要调用的函数添加一个手动延迟,所以这并不理想 那么,要使用self.tabBarCo
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方法…不确定是什么坏了或在哪里,但您的回答和评论帮助了大量调试。再次感谢!