gpt4 book ai didi

ios - 如何将值从 SceneDelegate 文件传输到 ViewController (Swift 5)

转载 作者:行者123 更新时间:2023-12-01 21:26:15 27 4
gpt4 key购买 nike

在其中一个 SceneDelegate 方法中,我想为另一个 ViewController 中的变量分配一个值。我怎样才能做到这一点?总是为零。我尝试了不同的方法,但由于某种原因它们不起作用,我想使用完成处理程序,但似乎我无法在 SceneDelegate 方法中做到这一点

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

var viewController: ViewController?
...
//This method works when I click on a cell
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
if let url = URLContexts.first?.url {

let oauthCompletion: DropboxOAuthCompletion = {
if let authResult = $0 {
switch authResult {
case .success:
self.dropboxManager.fetchFiles()
UserDefaults.standard.set(true, forKey:"userAuthorizedInDropbox")

//I want to assign a value here
self.viewController?.someString = "Some Text"

print("Success! User is logged into Dropbox.")
case .cancel:
print("Authorization flow was manually canceled by user!")
case .error(_, let description):
print("Error: \(String(describing: description))")
}
}
}
DropboxClientsManager.handleRedirectURL(url, completion: oauthCompletion)
}
}

...
class ViewController: UIViewController {
...
//But it's still nil
var someString: String?
...
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
dropboxManager.openDropboxAutorization(controller: self)
}
}

.....
class MainTabBarController: UITabBarController {
let viewController: ViewController = ViewController.loadFromStoryboard()
override func viewDidLoad() {
super.viewDidLoad()
viewControllers = [
generateVC(rootViewController: viewController, image: nil, title: "Import")
...
]

private func generateVC(rootViewController: UIViewController, image: UIImage?, title: String) -> UIViewController {
let navigationVC = UINavigationController(rootViewController: rootViewController)
navigationVC.tabBarItem.image = image
navigationVC.tabBarItem.title = NSLocalizedString(title, comment: "")
rootViewController.navigationItem.title = NSLocalizedString(title, comment: "")
return navigationVC
}
}
...
}

最佳答案

您可以访问您想要的ViewController来自您的rootViewController在场景委托(delegate)中。在以下示例中,我正在考虑您想要的 View Controller 位于标签栏 Controller 的第一个标签中。

if let tabbarController = self.window?.rootViewController as? UITabBarController,
let navigationController = tabbarController.viewControllers?.first as? UINavigationController,
let desiredController = navigationController.viewControllers.first as? ViewController {
desiredController.someString = "some value"
}
但在我看来,这不是推荐的方法,因为可能有很多情况可能取决于应用程序或导航堆栈的状态。
你可以做的是在你想要的 ViewController 中添加一个观察者。并从 SceneDelegate 发布通知像这样:
NotificationCenter.default.post(name: Notification.Name(rawValue: "someeventname"), object: "some value")
您可以像这样添加和收听观察者:
import UIKit

class ViewController: UIViewController {

override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.

NotificationCenter.default.addObserver(self, selector: #selector(someEventNotificationReceived(notification:)), name: Notification.Name(rawValue: "someeventname"), object: nil)
}

deinit {
NotificationCenter.default.removeObserver(self, name: Notification.Name(rawValue: "someeventname"), object: nil)
}

@objc func someEventNotificationReceived(notification: Notification) {
if let value = notification.object as? String {
//handle the event here
}
}
}

关于ios - 如何将值从 SceneDelegate 文件传输到 ViewController (Swift 5),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63470649/

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