我一直在研究并尝试其他人针对此问题发布的所有解决方案,但仍然没有得到解决。
我的用例非常简单。我有一个带按钮的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
}
}
在我的目标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")
}
}
答案 0 :(得分:3)
使用UITabBarController
时,viewDidLoad
方法仅在内存中装入任何UIViewController
时才调用一次。之后,当您浏览相同的UIViewController
时,它将从内存中加载。
为了克服此问题,必须将代码分为viewDidLoad
和viewDidAppear
。因此,在viewDidLoad
/ UIView
中,您只需在viewDidAppear
中将要初始化的代码放在整个应用程序中,例如添加viewWillAppear
或其他内容。 ,您可以进行API调用或获取动态数据的某些函数。
最后,当您调用self.tabBarController.selectedIndex = 0
时,它将只调用一次viewDidLoad
,并且每次导航viewDidAppear
时,它只会调用viewWillAppear
/ UIViewController
。
希望这有助于了解UITabBarController
的工作原理。
答案 1 :(得分:1)
对于UITabBarController
viewDidLoad
仅被调用一次。并且您的viewWillAppear
和viewDidAppear
被多次呼叫。您可以检查是否致电viewWillAppear
。因为您的视图将在viewDidAppear
之前被调用,就像进行反向工程过程一样。
您还可以将viewDidAppear
方法添加到您的UITabBarController
自定义类中。并以这种方式调用它的超类方法,我认为它将解决您的问题。
注意:对于
UITabbarController
,请始终执行用户界面更新任务和API调用任一任务viewWillAppear
或viewDidAppear