我正在使用Xcode7.0,正在学习iTunesU课程,斯坦福CS193p。这个程序“Smashtag”是用来显示与搜索相关的tweets。我已经尝试自己添加了一个功能,可以点击一条tweet,它会在另一个视图控制器中显示它。tableviewcell类有一个变量:
var tweet: Tweet?
tweet类有一个用户,该用户包含屏幕名称和名称,以及其配置文件图像的url(可选)。在表视图控制器中,单击单元格后创建了一个segue:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if let vc = segue.destinationViewController as? ViewController{
if let identifier = segue.identifier{
if identifier == "showTweet"{
if let selectedTweet = sender as? TweetTableViewCell{
vc.tweetToDisplay = selectedTweet.tweet!
}
}
}
}
然后在另一个视图控制器中,我有一个不同的线程:
self.profileImage.image = UIImage(data: imageData)
self.tweetMedia.image = UIImage(data: mediaData)
self.userName.text = "\(tweetToDisplay.user.name)"
self.userScreenName.text = "\(tweetToDisplay.user.screenName)"
if let body = tweetToDisplay.text{
self.tweetBody.text = body
}
userName、userScreenName、profileImage和tweetMedia都加载到视图控制器上;但是,tweetBody在标题中给出错误并使程序崩溃。我尝试了使用tweetBody进行可选链接;但是,tweetBody不显示。如有任何帮助,我们将不胜感激。
最佳答案
我在这个问题上挣扎了几个小时。我的工作是将视图控制器之间的数据交换存储在单独的变量中。下面是对我有效的解决方案。。希望能有所帮助。
而不是-
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if let vc = segue.destinationViewController as? ViewController{
if let identifier = segue.identifier{
if identifier == "showTweet"{
if let selectedTweet = sender as? TweetTableViewCell{
vc.tweetToDisplay = selectedTweet.tweet!
}
}
}
}
试试看-
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if let vc = segue.destinationViewController as? ViewController{
if let identifier = segue.identifier{
if identifier == "showTweet"{
if let selectedTweet = sender as? TweetTableViewCell{
guard let tweetText = selectedTweet.tweet! else {
return
}
vc.tweetToDisplayText = tweetText
}
}
}
}
在另一个视图控制器中声明一个字符串变量-
var tweetToDisplayText:String?
最后在
viewDidLoad:
方法中添加-tweetToDisplay.text = tweetToDisplayText