Сохранить любимое состояние кнопки с помощью 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)
Другие вопросы по тегам