Преобразование 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")