如何在 Xcode 中使用新的 Scene Delegate
How to use new Scene Delegate in Xcode
我正在尝试更改标签的文本或在我的 iOS 应用程序从后台状态变为活动状态时显示警报。
当我调用 ViewController class 中的函数时,只有 print() 方法可以正常工作。但是当我想与 class 中的对象交互时,它显示错误。
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)
}
与往常一样,正确的解决方案是让视图控制器监听相应的生命周期事件,而不是让应用程序委托或场景委托尝试告诉视图控制器任何事情。
在您的场景委托中,删除 ViewController
的创建和调用 showMessage
的尝试。
然后更新您的 ViewController
class。将以下内容添加到 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)
}
这样只有视图控制器需要知道它需要做什么和什么时候做的逻辑。
另请注意,如果您真的想检测场景 returns 何时从后台(进入前台),请使用 willEnterForegroundNotification
通知而不是 didActivateNotification
。
我正在尝试更改标签的文本或在我的 iOS 应用程序从后台状态变为活动状态时显示警报。
当我调用 ViewController class 中的函数时,只有 print() 方法可以正常工作。但是当我想与 class 中的对象交互时,它显示错误。
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)
}
与往常一样,正确的解决方案是让视图控制器监听相应的生命周期事件,而不是让应用程序委托或场景委托尝试告诉视图控制器任何事情。
在您的场景委托中,删除 ViewController
的创建和调用 showMessage
的尝试。
然后更新您的 ViewController
class。将以下内容添加到 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)
}
这样只有视图控制器需要知道它需要做什么和什么时候做的逻辑。
另请注意,如果您真的想检测场景 returns 何时从后台(进入前台),请使用 willEnterForegroundNotification
通知而不是 didActivateNotification
。