将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继续返回空值。提前致谢。
您可以将sender
参数设置为您想要的任何类型,没有理由使其成为self
,即如果这不是您所需的原始视图控制器。实际上,永远不需要传递始发视图控制器作为sender
,因为您可以从segue.sourceViewController
中获取prepareForSegue
。
在documentation为prepareForSegue
,苹果建议:
因为塞格斯可以从多个源引起,可以使用在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 let
和guard let
自选,这也可以帮助您避免强制铸造(!
),并可能导致应用程序崩溃。我已经在解开sender
到post
这样做了,所以你可以在那里看到一个例子。
您不需要再次声明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标识符。
您是如何检查其值?你还可以显示目的地vc显示你如何使用这些属性? –
使用控制台打印值。编辑我的问题以显示目的地vc。谢谢! – clp
你是在if语句执行中显示代码吗?在你的故事板中,segue标识符是否等于** seguetoVC **? –