我正在制作一个便笺应用程序,当应用程序处于背景状态或应用程序刚刚移动到后台时,它将保存用户默认数据。
这是ViewController.swift的代码
import UIKit
class ViewController: UIViewController {
let defaults = UserDefaults.standard
@IBOutlet weak var textField: UITextView!
override func viewDidLoad() {
super.viewDidLoad()
if let item = defaults.string(forKey: "Notes") {
textField.text = item
}
}
}这是SceneDelegate.swift的代码
import UIKit
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
let vc = ViewController()
let defaults = UserDefaults.standard
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
guard let _ = (scene as? UIWindowScene) else { return }
}
func sceneDidDisconnect(_ scene: UIScene) {
}
func sceneDidBecomeActive(_ scene: UIScene) {
}
func sceneWillResignActive(_ scene: UIScene) {
print("scene will resign active")
defaults.set(vc.textField.text!, forKey: "Notes") /*error*/
defaults.synchronize()
}
func sceneWillEnterForeground(_ scene: UIScene) {
}
func sceneDidEnterBackground(_ scene: UIScene) {
}
}我已经在@IBAction button上实现了同样的功能,而且它确实运行得很好。但是,当我在sceneWillResignActive()方法中保存默认数据时,它会显示此错误
/*错误-线程1:致命错误:在隐式展开可选值*/时意外找到零
如何在sceneWillResignActive()方法或任何其他场景方法中保存UserDefault数据?
发布于 2020-09-30 10:26:32
我所要做的不是使用UIWindowSceneDelegate,而是使用UITextViewDelegate Protocol。没有必要在SceneDelegate.swift,中更改任何代码,因为没有完全使用Scenes的实例。有必要在textViewField完成编辑后立即保存实例。
ViewController.swift
import UIKit
class ViewController: UIViewController, UITextViewDelegate {
@IBOutlet weak var textView: UITextView!
override func viewDidLoad() {
super.viewDidLoad()
textView.delegate = self
textView.backgroundColor = .systemBlue
if let item = UserDefaults.standard.string(forKey: "Notes") {
textView.text! = item
}
}
func textViewDidChange(_ textView: UITextView) {
UserDefaults.standard.set(textView.text!, forKey: "Notes")
}
}阅读UITextViewDelegate 这里的苹果文档。
您可以观看这视频以供参考。谢谢!!
https://stackoverflow.com/questions/64128389
复制相似问题