Swift 如何使用UserDefaults保存UIButton图像?
我想在UserDefaults中保存一个UIButton图像,并在以后的代码中用一个键检索它。UIImage来自UIPickerView正在使用的元组Swift 如何使用UserDefaults保存UIButton图像?,swift,Swift,我想在UserDefaults中保存一个UIButton图像,并在以后的代码中用一个键检索它。UIImage来自UIPickerView正在使用的元组 let defaults = UserDefaults.standard @IBOutlet weak var topCurrencyPicker: UIPickerView! var topPickerOptions = [ (symbol: String, name: String, sign: String, flag: UII
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?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,您可以像存储数据一样存储它
用法
PreferencesService().avatar = button.image(for: .normal)
奖励:注意如何简单地存储其他类型的Bool、Date、String。您真的需要物理保存图像吗?保存一个名称或URL还不够吗?如果需要,我可以通过Assets.xcsets名称保存它,只要我的图像回到我想要的位置。这绝对是更好的选择。资产名称必须是唯一的。存在大量冗余代码。
documents
目录保证存在,因此返回可选的和相关的guard
语句是没有意义的。