将tableview单元信息链接到视图控制器

时间:2016-03-07 08:18:40

标签: swift

我对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继续返回一个空值。提前谢谢。

2 个答案:

答案 0 :(得分:0)

您无需再次声明indexPathdidSelectRowAtIndexPath已有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,所以你可以在那里看到一个例子。