【问题标题】:How to save an UIButton image using UserDefaults?如何使用 UserDefaults 保存 UIButton 图像?
【发布时间】:2019-03-20 12:51:56
【问题描述】:

我想在 UserDefaults 中保存一个 UIButton 图像,稍后在我的代码中使用一个键检索它。 UIImage 来自 UIPickerView 正在使用的元组。

let defaults = UserDefaults.standard

@IBOutlet weak var topCurrencyPicker: UIPickerView!

var topPickerOptions = [
    (symbol: String, name: String, sign: String, flag: UIImage)]()

func createTopAndBottomCurrency() {
    let topUserIndex = topCurrencyPicker.selectedRow(inComponent: 0)
    let topUserChoice = money.currencyISOCode[topUserIndex]
    userCurrencyChoice = Currencies(top: topUserChoice, bottom: bottomUserChoice)

// Save user pickerViews Choice
    defaults.set(topUserIndex,
                 forKey: ExchangePreferencesVC.topExPickerKey)
    defaults.set(userCurrencyChoice.top.sign,
                 forKey: ExchangePreferencesVC.topExSignKey)
    defaults.set(userCurrencyChoice.top.symbol,
                 forKey: ExchangePreferencesVC.topExSymbolKey)
}

是否可以像保存字符串一样轻松地保存此 UIImage?

【问题讨论】:

  • 您真的需要物理保存图像吗?保存名称或 URL 还不够吗?
  • 如果需要,我可以通过它的 Assets.xcassets 名称保存它,只要我将图像放回我想要的位置。
  • 这绝对是更好的选择。资产名称必须是唯一的。

标签: swift


【解决方案1】:

Swift 4.2

public final class PreferencesService {
  private let userDefaults: UserDefaults

  init(userDefaults: UserDefaults = .standard) {
    self.userDefaults = userDefaults
  }

  var avatar: UIImage? {
    get {
        guard let filename = documentsDirectory?.appendingPathComponent(#function, isDirectory: false) else {
            return nil
        }
        return UIImage(contentsOfFile: filename.path)
    }
    set {
        guard let filename = documentsDirectory?.appendingPathComponent(#function, isDirectory: false) else {
            return
        }
        guard let newImage = newValue else {
            try? FileManager.default.removeItem(at: filename)
            return
        }
        if let data = newImage.jpegData(compressionQuality: 1.0) {
            try? data.write(to: filename)
        }
    }
  }

  private var documentsDirectory: URL? {
      let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
      return paths.first
  }

  var coolDown: Bool {
      get { return userDefaults.bool(forKey: #function) }
      set { userDefaults.set(newValue, forKey: #function) }
  }

  var lastVisited: Date {
      get { return userDefaults.object(forKey: #function) as? Date ?? Date() }
      set { userDefaults.set(newValue, forKey: #function) }
  }

}

最好将图像存储在文档目录中。 如果需要存储 UserDefaults - 您可以像 Data 一样存储它。

用法

PreferencesService().avatar = button.image(for: .normal)

奖励:注意如何简单地存储其他类型的 Bool、Date、String。

【讨论】:

  • 有很多冗余代码。 documents 目录保证存在,因此返回一个可选的和相关的guard 语句是没有意义的。
猜你喜欢
  • 2015-03-07
  • 2016-03-25
  • 2017-05-09
  • 1970-01-01
  • 2021-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多