我有一个textView,这是整个屏幕的应用程序。用户输入新的文本,更改属性等。我希望应用程序保存文本视图的内容与其属性为下一次。我想到了userDefaults。我试了很多,但什么也没发生。我找不到解决方案。我从stackoverflow https://stackoverflow.com/a/36940864/12698480尝试了这个解决方案,但没有改变。文本视图再次出现空屏幕。我的代码作为Userdefaults的扩展如下所示:
//Save text
func setNSMutableText(string: NSMutableAttributedString?, forKey key: String){
var stringData: NSData?
if let string = string {
do {
stringData = try NSKeyedArchiver.archivedData(withRootObject: string, requiringSecureCoding: false) as NSData?
set(stringData, forKey: key)
print("archived NSMutableData")
} catch let err {
print("error archiving string data", err)
}
}
}
//LOAD text
func getNSMutableForKey(key: String) -> NSMutableAttributedString? {
var string: NSMutableAttributedString?
if let stringData = data(forKey: "screentextKey") {
do {
string = try NSKeyedUnarchiver.unarchivedObject(ofClass: NSMutableAttributedString.self, from: stringData)
print("UNARchived string data!!!")
} catch let err {
print("error extracting string data", err)
}
}
return string
}
用法:
//For saving
UserDefaults.standard.setNSMutableText(string: NSMutableAttributedString(attributedString: myTextView.attributedText), forKey: "screentextKey")
//For loading
override func viewDidLoad() {
super.viewDidLoad()
let oldstring = (UserDefaults.standard.getNSMutableForKey(key: "screentextKey"))!
myTextView.attributedText = oldstring
}
有什么问题吗?我看到有人建议用NSAttributedString代替NSMutableAttributedString。我也尝试过这种方式,但没有改变。
发布于 2020-12-10 10:19:03
为了让它以您想要的方式工作,您不必使用NSKeyedArchiver.archivedData。相反,使用CoreData将数据保存在设备内存中要好得多(因为如果我认为它不是很大的数据量),使用XCDataModel构造它,然后使用NSFetchController获取它。
在XCDataModel中,您必须创建实体并为其设置属性(字符串、布尔值、双精度值等)。
在此之后,您必须设置NSFetchedResultsController才能管理该进程。
下面是我设置它的方式:
静态let错误: NSPersistentContainer ={ let persistentContainer= NSPersistentContainer(name:"RebelFitness") container.loadPersistentStores { (_,error) in if let error = error as NSError?{ fatalError("Unresolved ( error ),(error.userInfo)") }} return container }()
惰性变量fetchedResultsController: NSFetchedResultsController ={
让fetchRequest: NSFetchRequest< YourEntityName >= YourEntityName.fetchRequest() fetchRequest.sortDescriptors = NSSortDescriptor(key:" distance ",ascending: true),NSSortDescriptor(key:"duration",ascending: true) //这里你使用descriptor对我示例中的数据进行排序,距离首先以数组形式出现,然后任何其他元素都让fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest,managedObjectContext: nil sectionNameKeyPath: nil,cacheName: nil) fetchedResultsController.delegate = self as?NSFetchedResultsControllerDelegate return fetchedResultsController }()
用于获取已保存数据的
静态变量上下文:返回{ NSManagedObjectContext persistentContainer.viewContext }
在此函数中,我们将数据提取到新的数组,该数组将把数据传递给为UIKit元素提供数据的数组
func loadIsCurrent() -> [YourEntityName] {
var _data : [YourEntityName] = []
let context = persistentContainer.viewContext
let fetchRequest: NSFetchRequest< YourEntityName > = YourEntityName.fetchRequest()
fetchRequest.sortDescriptors = [NSSortDescriptor(key: "distance", ascending: false), NSSortDescriptor(key: "duration", ascending: true)]
do {
let data = try context.fetch(fetchRequest)
if(sessions.count > 0) {
_data = data
}
} catch {
print("Something happened while trying to retrieve tasks...")
}
return _data
}
函数上下文() {让saveContext = persistentContainer.viewContext
guard context.hasChanges else {
return
}
do {
try context.save()
try fetchedResultsController.performFetch()
} catch {
let nserror = error as NSError
fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
}
}
https://stackoverflow.com/questions/65231241
复制相似问题