gpt4 book ai didi

swift - 如何在 Xcode 中使用新的 Scene Delegate

转载 作者:行者123 更新时间:2023-11-28 13:24:54 25 4
gpt4 key购买 nike

当我的 iOS 应用程序从后台状态变为事件状态时,我正在尝试更改标签的文本或显示警报。

当我调用 ViewController 类中的函数时,只有 print() 方法可以正常工作。但是当我想与那个类中的对象交互时,它会显示错误。

SceneDelegate.swift:

var vc = ViewController()

func sceneDidBecomeActive(_ scene: UIScene) {
// Called when the scene has moved from an inactive state to an active state.
// Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive.

vc.showMessage("Test message")
}

ViewController.swift:

@IBOutlet weak var textLabel: UILabel!

func showMessage(_ incomingMessage:String!) {
let warning = UIAlertController(title: "Warning", message: incomingMessage, preferredStyle: .alert)
let aButton = UIAlertAction(title: "OK", style: .cancel, handler: nil)
warning.addAction(aButton)

self.present(warning, animated: true)

textLabel.text = incomingMessage

print("message is : " + incomingMessage)
}

最佳答案

与往常一样,正确的解决方案是让 View Controller 监听相应的生命周期事件,而不是让应用委托(delegate)或场景委托(delegate)尝试告诉 View Controller 任何事情。

在您的场景委托(delegate)中,删除 ViewController 的创建和调用 showMessage 的尝试。

然后更新您的 ViewController 类。将以下内容添加到 viewDidLoad:

NotificationCenter.default.addObserver(self, selector: #selector(didActivate), name: UIScene.didActivateNotification, object: nil)

然后添加didActivate方法:

func didActivate() {
showMessage("Test Message")
}

然后添加deinit:

deinit {
NotificationCenter.default.removeObserver(self)
}

这样只有 View Controller 需要知道它需要做什么以及何时做的逻辑。

另请注意,如果您真的想检测场景何时从后台返回(进入前台),请使用 willEnterForegroundNotification 通知而不是 didActivateNotification

关于swift - 如何在 Xcode 中使用新的 Scene Delegate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58538342/

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