在打开可选的AFTER条件展开时,出乎意料地发现了nil

时间:2016-03-03 14:46:35

标签: ios swift uitableview twitter optional

我正在使用XCode 7.0并参加了iTunesU课程,Stanford CS193p。该计划," Smashtag,"用于显示与搜索相关的推文。我试图自己添加一个功能来点击一条推文,它会在不同的视图控制器中显示它。 tableviewcell类有一个变量:

    var tweet: Tweet?

tweet类有一个用户,其中包含屏幕名称和名称,以及他们的个人资料图片的网址,这是一个可选的。在我的表视图控制器中,我在单击一个单元格后创建了一个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没有显示。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:0)

我已经在这个问题上挣扎了几个小时。对我有用的是将视图控制器之间的数据交换存储在单独的变量中。以下是适合我的解决方案..希望有所帮助。

而不是 -

 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
                    }
                }
            }
        }

在您的其他View Controller中声明一个字符串变量 -

var tweetToDisplayText:String?

最后在viewDidLoad:方法中添加 -

tweetToDisplay.text = tweetToDisplayText

答案 1 :(得分:-1)

太简单了,我的朋友只需更换这两行

(segue: UIStoryboardSegue, sender: AnyObject?) to (segue: UIStoryboardSegue, sender: AnyObject!)

let selectedTweet = sender as? TweetTableViewCell to let selectedTweet = sender as TweetTableViewCell

这样可以正常工作。快乐编码。提供您的反馈。