ios - 保存 UIFont?到 UserDefault Swift 3

标签 ios swift

我创建了一个步进器来增加我的应用程序中的字体大小,现在,我想保存最后一个字体大小,这样当用户重新打开应用程序时,最后一个字体大小将保持不变。我试图将它保存到 UserDefaults 但它不会让我保存我的标签,因为我正在使用 UIFont 来建立我想要的字体类型,并且 CGFloat 能够使用我的步进器切换字体大小。

当我运行应用程序并尝试选择字体大小时,应用程序崩溃了,我找不到问题所在。我知道问题是试图将 UIFont 中的数据保存到 UserDefaults 中,因为当我注释掉那行代码时,应用程序没有运行问题。

此外,在我尝试调用 ViewDidAppear 函数中存储的 UserDefault 设置后,我收到一条错误消息,指出我无法分配任何?键入 UIFont?

如有任何帮助,我们将不胜感激。同样,我的意图是,当用户使用步进器更改字体大小时,字体大小将保持不变,即使在退出并重新打开应用程序后也是如此。

import UIKit
import Foundation

class ViewController: UIViewController {
@IBOutlet weak var quotesLabel: UITextView!
@IBOutlet weak var welcomeLabel: UILabel!
@IBOutlet weak var topLabel: UILabel!
@IBOutlet weak var generateLabel: UILabel!
@IBOutlet weak var fontStepper: UIStepper!
@IBOutlet weak var minFontSizeLabel: UILabel!
@IBOutlet weak var adjustFontSizeLabel: UILabel!
@IBOutlet weak var maxFontSizeLabel: UILabel!


    let quotesBook = QuotesBook()
    let defaults = UserDefaults.standard



    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically   from a nib



        fontStepper.wraps = true
        fontStepper.autorepeat = true
        generateLabel.font = UIFont(name: "HoeflerText-Italic", size: 15)
        generateLabel.textColor = UIColor(red: 25/255, green: 23/255, blue: 170/255, alpha: 230/255)
        generateLabel.textAlignment = NSTextAlignment.center
        topLabel.font = UIFont(name: "HoeflerText-Italic", size: 20)
        topLabel.textColor = UIColor(red: 25/255, green: 23/255, blue: 170/255, alpha: 230/255)



}

override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

@IBAction func stepperPressed(_ sender: UIStepper) {
    quotesLabel.isEditable = true
    quotesLabel.font = UIFont (name: "Futura-MediumItalic", size: CGFloat(Float(sender.value)))
    defaults.set(quotesLabel.font, forKey: "textSize")




}
@IBAction func showQuoteBttn(_ sender: Any) {
    quotesLabel.textAlignment = NSTextAlignment.center
    maxFontSizeLabel.isHidden = false
    adjustFontSizeLabel.isHidden = false
    minFontSizeLabel.isHidden = false
    fontStepper.isHidden = false
    generateLabel.isHidden = false
    welcomeLabel.isHidden = true
    topLabel.isHidden = true
    quotesLabel.isHidden = false
    quotesLabel.text = quotesBook.randomQuote()

}

override func viewDidAppear(_ animated: Bool) {
    if let b = defaults.object(forKey: "textSize")
    {
    quotesLabel.font = b
    }

}

最佳答案

您不能将 (UI)Font 直接保存到用户默认值中,因为它不符合属性列表。

一个合适的解决方案是分别保存字体的String 名称和Float 大小。这可以通过 UserDefaults 的扩展来实现:

extension UserDefaults {

    func set(font : UIFont, forKey key : String)
    {
        let fontName = font.fontName
        let fontSize = font.pointSize
        self.set(fontName, forKey: key + "_name")
        self.set(Float(fontSize), forKey: key + "_size")
    }

    func font(forKey key : String) -> UIFont?
    {
        guard let fontName = string(forKey: key + "_name") else { return nil }
        let fontSize = float(forKey: key + "_size")
        if fontSize == 0.0 { return nil }
        return UIFont(name: fontName, size: CGFloat(fontSize))
    }
}

或者 - 也有一个扩展 - 将字体存档和取消存档到 NSData:

extension UserDefaults {

    func set(font: UIFont, forKey key: String)
    {
        let data = NSKeyedArchiver.archivedData(withRootObject: font)
        self.set(data, forKey: key)
    }

    func font(forKey key: String) -> UIFont?
    {
        guard let data = data(forKey: key) else { return nil }
        return NSKeyedUnarchiver.unarchiveObject(with: data) as? UIFont
    }
}

关于ios - 保存 UIFont?到 UserDefault Swift 3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41813984/

相关文章:

ios - UIActivityViewController Gmail 共享扩展重复正文

iOS:如何获取 iOS 9 的服务包 header ?

ios - Apple Smart Banner 上的应用参数是否会在安装时传递给应用?

ios - SwiftUI - 动态过滤时防止部分在列表中向右飞行/缩放

ios - Swift:如何在纵向模式下正确旋转 UITableViewController 和 UIViewController

swift - 刷新 applicationWillEnterForeground 上的 UILabel

swift - 如何使用 arc4random_uniform 从数组中随机选择一个值

ios - 限制表格 View ,除非快速选择所有单元格

ios - 在 Core Data 中存储 UIColor 对象

ios - 无法转换类型 [NSObject : AnyObject] to string