首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >用于NSMutableAttributedString的UserDefaults

用于NSMutableAttributedString的UserDefaults
EN

Stack Overflow用户
提问于 2020-12-10 08:50:26
回答 1查看 82关注 0票数 1

我有一个textView,这是整个屏幕的应用程序。用户输入新的文本,更改属性等。我希望应用程序保存文本视图的内容与其属性为下一次。我想到了userDefaults。我试了很多,但什么也没发生。我找不到解决方案。我从stackoverflow https://stackoverflow.com/a/36940864/12698480尝试了这个解决方案,但没有改变。文本视图再次出现空屏幕。我的代码作为Userdefaults的扩展如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//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
    }

用法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//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。我也尝试过这种方式,但没有改变。

EN

回答 1

Stack Overflow用户

发布于 2020-12-10 10:19:03

为了让它以您想要的方式工作,您不必使用NSKeyedArchiver.archivedData。相反,使用CoreData将数据保存在设备内存中要好得多(因为如果我认为它不是很大的数据量),使用XCDataModel构造它,然后使用NSFetchController获取它。

在XCDataModel中,您必须创建实体并为其设置属性(字符串、布尔值、双精度值等)。

在此之后,您必须设置NSFetchedResultsController才能管理该进程。

下面是我设置它的方式:

  1. 导入CoreData

  1. set persistent Container(数据容器):

静态let错误: NSPersistentContainer ={ let persistentContainer= NSPersistentContainer(name:"RebelFitness") container.loadPersistentStores { (_,error) in if let error = error as NSError?{ fatalError("Unresolved ( error ),(error.userInfo)") }} return container }()

  1. set NSFetchedResultsController:

惰性变量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 }()

用于获取已保存数据的

  1. 函数:

静态变量上下文:返回{ NSManagedObjectContext persistentContainer.viewContext }

在此函数中,我们将数据提取到新的数组,该数组将把数据传递给为UIKit元素提供数据的数组

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
    }

  1. 将数据保存到coreData:

函数上下文() {让saveContext = persistentContainer.viewContext

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
guard context.hasChanges else {
  return
}
    
do {
  try context.save()
    try fetchedResultsController.performFetch()
} catch {
  let nserror = error as NSError
  fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
    }

}

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65231241

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文