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

问题描述:

我对Swift很新颖。我希望在新视图控制器中反映tableview单元格数据(标题和帖子的描述)。这是我放入第一个视图控制器(包含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..Added的一部分变量,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

您是如何检查其值?你还可以显示目的地vc显示你如何使用这些属性? –

+0

使用控制台打印值。编辑我的问题以显示目的地vc。谢谢! – clp

+0

你是在if语句执行中显示代码吗?在你的故事板中,segue标识符是否等于** seguetoVC **? –

您可以将sender参数设置为您想要的任何类型,没有理由使其成为self,即如果这不是您所需的原始视图控制器。实际上,永远不需要传递始发视图控制器作为sender,因为您可以从segue.sourceViewController中获取prepareForSegue

documentationprepareForSegue,苹果建议:

因为塞格斯可以从多个源引起,可以使用在SEGUE和发件人的参数信息,您的应用程序不同的逻辑路径之间的歧义。例如,如果segue源自表视图,sender参数将标识用户点击的表视图单元格。然后,您可以使用该信息在目标视图控制器上设置数据。

这听起来确实是你所处的情况。既然你已经想出了你的单元格的模型对象,我们可以通过它而不是单元格。因此,您可以拨打performSegueWithIdentifier("seguetoVC", sender: post),然后更改您的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 letguard let自选,这也可以帮助您避免强制铸造(!),并可能导致应用程序崩溃。我已经在解开senderpost这样做了,所以你可以在那里看到一个例子。

您不需要再次声明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标识符。