在解包可选的 AFTER 条件解包后意外发现 nil



我正在使用XCode 7.0,并且正在学习iTunesU课程,斯坦福CS193p。该程序"Smashtag"旨在显示与搜索相关的推文。我尝试自己添加一个功能来点击推文,它会在不同的视图控制器中显示它。表视图单元格类有一个变量:

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

用户名、用户屏幕名称、profileImage 和 tweetMedia 都加载到视图控制器上;但是,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

太简单了,我的朋友只是替换这两行

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

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

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

最新更新