Как сохранить изображение UIButton, используя UserDefaults? - PullRequest
0 голосов
/ 20 марта 2019

Я хочу сохранить изображение UIButton внутри UserDefaults и получить его позже с помощью ключа в моем коде. 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 так же легко, как и строку?

1 Ответ

0 голосов
/ 20 марта 2019

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...