Сохранить любимое состояние кнопки с помощью indexPath.row
Я сделал любимую кнопку для моих detailViews(у меня есть приложение master-detail), и оно обычно сохраняет состояние кнопки для всех ячеек /DetailsViews... Я хочу, если я нажму 3 ячейки индекса, это сохранит состояние кнопки только там., если я перейду к индексу 4, он сохранит его отдельно в этой строке и не сохранит одно и то же состояние для всех ячеек.
Любимая кнопка:
//create a new button
let Favoritebutton: UIButton = UIButton(type: UIButtonType.custom)
//set image for button
Favoritebutton.setImage(UIImage(named: "EmptyHeart.png"), for: .normal)
Favoritebutton.setImage(UIImage(named: "FilledHeart.png"), for: .selected)
//add function for button
Favoritebutton.addTarget(self, action: #selector(self.button), for: .touchUpInside)
//set frame
Favoritebutton.frame = CGRect(x:0,y: 0,width: 35,height: 35)
Favoritebutton.isSelected = UserDefaults.standard.bool(forKey: "isSaved")
let barButton = UIBarButtonItem(customView: Favoritebutton)
//assign button to navigationbar
self.navigationItem.rightBarButtonItem = barButton
func button(sender: UIButton) {
audioPlayer.play()
let newValue = !sender.isSelected
sender.isSelected = newValue
UserDefaults.standard.set(newValue, forKey: "isSaved")
let tabItem = self.tabBarController?.tabBar.items![3]
sel_val = tabItem?.badgeValue
if(sel_val == nil){
sel_val = "0"
}
let sel_num = Int(sel_val!)
let fav: NSMutableArray = []
fav.add(barImage)
fav.add(barName)
fav.add(streetName)
if sender.isSelected {
tabItem!.badgeValue = String(format: "%d", sel_num! + 1)
favorite.add(fav)
} else {
tabItem!.badgeValue = String(format: "%d", sel_num! - 1)
favorite.remove(fav)
}
}
Как я могу сделать состояние сохранения кнопки для каждого indexPath индивидуально, как я хочу?
Это поможет мне закончить мою любимую функцию, так что ваша помощь будет очень цениться!
Спасибо за помощь!
1 ответ
То, что вы хотите, это хранить массив или словарь, зависит от ситуации. Вот пример, как хранить массив Как сохранить NSMutablearray в NSUserDefaults. Я предлагаю получить значения из значений по умолчанию при запуске приложения и присвоить их значению, чтобы у вас была локальная копия. Не забывайте сохранять массив обратно в значения по умолчанию после каждого изменения или, по крайней мере, при выходе из приложения.
РЕДАКТИРОВАТЬ:
Вы хотите хранить словарь bool, так что вы можете получить доступ к значениям для каждой строки. Я не рекомендую вам использовать indexPath, скорее вы должны использовать идентификатор, который будет уникальным для строки.
Они будут служить локальным хранилищем для вашего приложения.
let favoritesKey = "favorites"
var favorites: [Int: Bool] = [:]
Вот как вы получаете сохраненный словарь:
favorites = userDefaults.object(forKey: favoritesKey) as? [Int : Bool] ?? [:]
Вот как вы меняете свои значения:
favorites[index] = true / false
Вот как вы получаете ваши ценности:
let value = favorites[index]
Вот как вы сохраняете значения:
let userDefaults = UserDefaults.standard
userDefaults.set(favorites, forKey: favoritesKey)