gpt4 book ai didi

swift - self.tabBarController.selectedIndex 不调用 viewDidAppear

转载 作者:搜寻专家 更新时间:2023-11-01 06:11:54 25 4
gpt4 key购买 nike

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

我的用例非常简单。我有一个带有按钮的 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

}
}

在我的目标 View Controller 中:

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...
}

为我的标签栏 Controller 添加了一个自定义类:

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 时,它只会调用一次 viewDidLoadviewDidAppear/ viewWillAppear 每次当您浏览那个 UIViewController 时。

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

关于swift - self.tabBarController.selectedIndex 不调用 viewDidAppear,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54358652/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com