Преобразование NSIndexPath в NSInteger в Swift

У меня есть UITableView с segue, который подключается к контроллеру представления. Когда пользователь нажимает на ячейку, я хотел бы indexPath.row для передачи этому контроллеру представления, чтобы я мог обновлять содержимое представления, основываясь на том, какая ячейка была нажата.

Я знаю о различных способах сделать это, однако я хотел бы использовать NSUserDefaults() для моего конкретного использования. Проблема в том, что я не знаю, как конвертировать indexPath.row в целое число, которое будет сохранено в NSUserDefaults(), Вот что я попробовал:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    println(indexPath.row)
    NSUserDefaults.standardUserDefaults().setObject(NSInteger(indexPath.row), forKey: "index")

    self.performSegueWithIdentifier("event", sender: self)
}

Контроллер второго вида:

override func viewDidAppear(animated: Bool) {
    println(NSUserDefaults.standardUserDefaults().integerForKey("event"))
}

В тот момент, когда я пытаюсь распечатать indexPath.row в следующем контроллере представления он всегда просто возвращает 0.

3 ответа

Решение

Вы не используете тот же ключ

NSUserDefaults.standardUserDefaults().setObject(NSInteger(indexPath.row), forKey: "index") // <--- INDEX

NSUserDefaults.standardUserDefaults().integerForKey("event")) // <-- EVENT

Вас также:

  • Возможно, хотите сохранить / прочитать его эквивалентным методом setInteger:forKey: а также integerForKey:
  • Не нужно конвертировать значение (это уже целое число);

Убедитесь, что вы не рисуете себя в углу. NSIndexPath содержит два числа, а не одно: раздел и строку в этом разделе. В простых случаях, когда в табличном представлении есть только один раздел, номер раздела всегда будет равен нулю, но вы получите более сложные случаи.

Если вы хотите сохранить пути индекса, я бы добавил категорию к NSUserDefaults одним методом, который превращает NSIndexPath в словарь с разделом ключей и строкой и записывает его, а также тем, который читает словарь и создает NSIndexPath со значениями для раздела и строка.

Тем не менее, номер строки является что-то ужасно нестабильным. Ваши дизайнеры пользовательского интерфейса решают, что две строки должны изменить свой порядок, и все ваши настройки нарушены. Что я делаю, так это одно перечисление, которое определяет назначение каждой строки; это перечисление никогда не должно когда-либо менять свои значения, и это сохраняется в предпочтении. И еще есть другое перечисление, которое относится к элементам в пользовательском интерфейсе, и которое может свободно изменяться.

Сохранение строки (целое число):

NSUserDefaults.standardUserDefaults().setInteger(indexPath.row, forKey: "row")
NSUserDefaults.standardUserDefaults().synchronize()

Загрузка строки (целое число) Значение:

 row() -> Int
 var row = NSUserDefaults.standardUserDefaults().integerForKey("row")
Другие вопросы по тегам