在 Swift 中将 NSIndexPath 转换为 NSInteger

Converting NSIndexPath to NSInteger in 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 时,它总是只是 returns 0.

您使用的不是同一个密钥

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

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

还有你:

  • 可能想用等效的方法保存/读取它 setInteger:forKey:integerForKey:
  • 不必转换值(它已经是一个整数);

保存一行(整数)值:

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

正在加载一行(整数)值:

 row() -> Int
 var row = NSUserDefaults.standardUserDefaults().integerForKey("row")

确保你不会把自己画在角落里。 NSIndexPath 包含 两个 个数字,而不是一个:一个部分和该部分中的一行。在 table 视图只有一个部分的琐碎情况下,部分编号将始终为零,但您会遇到更复杂的情况。

如果你想存储索引路径,我会向 NSUserDefaults 添加一个类别,其中一种方法将 NSIndexPath 转换为具有键部分和行的字典并写入,另一种方法读取字典并创建 NSIndexPath部分和行的值。

也就是说,行号是非常不合理的东西table。您的 UI 设计师决定必须更改两行的顺序,您的所有偏好都被破坏了。我所做的是一个枚举,用于标识每一行的用途;该枚举绝不能永远改变其值,并且存储在首选项中。然后还有另一个枚举,它引用 UI 中的项目,并且可以自由更改。