我正在使用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

10-04 10:23