我对Swift很新。我希望在新的视图控制器中反映tableview单元格数据(帖子的标题和描述)。这是我放在第一个视图控制器(包含tableview单元格)中的代码。
func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!) {
let indexPath = tableView.indexPathForSelectedRow()!
let currentCell = tableView.cellForRowAtIndexPath(indexPath) as! PostCell!
let post = posts[indexPath.row]
valuetoPass = post.title
valuetoPass_desc = post.postDescription
performSegueWithIdentifier("seguetoVC", sender: self)
}
这一个......
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "seguetoVC" {
let viewController = segue.destinationViewController as! UpdateVC
viewController.toPassTitle = valuetoPass
viewController.toPassDesc = valuetoPass_desc
}
}
这是UpdateVC的一部分..添加了变量toPassTitle和toPassDesc ......这些是我添加到viewDidLoad()的行:
override func viewDidLoad() {
super.viewDidLoad()
self.postTxt.delegate = self
self.descTxt.delegate = self
descTxt.text = toPassTitle
postTxt.text = toPassDesc
}
只是想知道我做错了什么 - viewController.toPassTitle和viewController.toPassDesc继续返回一个空值。提前谢谢。
答案 0 :(得分:0)
您无需再次声明indexPath
。 didSelectRowAtIndexPath
已有indexPath
。使用didSelectRowAtIndexPath
方法更新您的代码。
func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!) {
let post = posts[indexPath.row]
valuetoPass = post.title
valuetoPass_desc = post.postDescription
performSegueWithIdentifier("seguetoVC", sender: self)
}
最重要的是,确保在故事板中,您还需要使用seguetoVC
命名您的segue标识符。
答案 1 :(得分:0)
您可以将sender
参数设置为您想要的任何类型,没有理由将它作为self
,即原始视图控制器(如果不是您需要的那样)。实际上,永远不需要将原始视图控制器作为sender
传递,因为您可以从segue.sourceViewController
中的prepareForSegue
获取它。
在prepareForSegue
performSegueWithIdentifier("seguetoVC", sender: post)
中,Apple建议:
由于segues可以从多个源触发,因此您可以使用segue和sender参数中的信息来消除应用中不同逻辑路径之间的歧义。例如,如果segue源自表视图,则sender参数将标识用户点击的表视图单元格。然后,您可以使用该信息在目标视图控制器上设置数据。
这听起来就像你所处的情况。由于你已经找到了你的细胞的模型对象,我们可以通过它而不是细胞。因此,您可以致电prepareForSegue
,然后更改override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "seguetoVC" {
let viewController = segue.destinationViewController as! UpdateVC
if let post = sender as ? Post {
viewController.toPassTitle = post.title
viewController.toPassDesc = post.postDescription
}
}
}
实施以直接使用帖子中的详细信息,例如
tableView.cellForRowAtIndexPath(indexPath) as! PostCell!
您无需在任何地方拨打didSelectRowAtIndexPath
,但这可能相当昂贵,所以如果您不使用它,请不要这样做。您的func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
let post = posts[indexPath.row]
performSegueWithIdentifier("seguetoVC", sender: post)
}
方法可能看起来更像这样:
if let
还有一些你可以做的更安全,所以看看使用guard let
和!
这样的结构展开选项,这也可以帮助你避免强制转换({{ 1}}),并可能导致您的应用崩溃。我已经完成了将sender
解包到post
,所以你可以在那里看到一个例子。