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
只调用一次。你的 viewWillAppear
和 viewDidAppear
被多次调用。您可以检查您的 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
我一直在查看并尝试其他人针对此问题发布的所有解决方案,但我仍然没有得到它。
我的用例非常简单。我有一个带按钮的 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
只调用一次。你的 viewWillAppear
和 viewDidAppear
被多次调用。您可以检查您的 viewWillAppear
是否被调用。因为您的视图会在 viewDidAppear
之前被调用,这就像经历逆向工程过程一样。
您还可以将 viewDidAppear
方法添加到您的 UITabBarController
自定义 class 中。并以这种方式调用它的 superclass 方法,我认为它会解决你的问题。
Note: In the case of
UITabbarController
, Always do your UI update task and API calling a task in eitherviewWillAppear
orviewDidAppear