Swift - 错误:在解包可选值时意外发现nil

时间:2014-07-12 17:06:27

标签: uitableview swift ios8 xcode6

我一直在Swift中创建一个应用程序,但我的TableViewController类中一直出现错误。我找不到任何方法来解决这个问题并且不断收到此错误:

override func tableView(tableView: UITableView?, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell!  {
        let cell : TextTableViewCell = tableView!.dequeueReusableCellWithIdentifier("Cell", forIndexPath : indexPath!) as TextTableViewCell

    let madan : PFObject = self.timeLineData.objectAtIndex(indexPath!.row) as PFObject

    cell.timestampLabel.alpha = 0
    cell.usernameLabel.alpha = 0
    cell.madanTextView.alpha = 0

    cell.madanTextView.text = madan.objectForKey("content") as String

    var dateFormatter : NSDateFormatter = NSDateFormatter()
    dateFormatter.dateFormat = "MM-dd-yyyy HH:mm"
    cell.timestampLabel.text = dateFormatter.stringFromDate(madan.createdAt)

    var findSender : PFQuery = PFUser.query()
    findSender.whereKey("objectId", equalTo: madan.objectForKey("sender").objectId)
    var i = 1
    findSender.findObjectsInBackgroundWithBlock {
        (objects: [AnyObject]!, error: NSError!) -> Void in
        if !error {
            let user : PFUser = (objects as NSArray).lastObject as PFUser // Error here

            cell.usernameLabel.text = user.username 

            UIView.animateWithDuration(0.5, animations: {

                cell.timestampLabel.alpha = 1
                cell.usernameLabel.alpha = 1
                cell.madanTextView.alpha = 1

            })
        }
    }    
    return cell
}

我找不到任何解决方法。

2 个答案:

答案 0 :(得分:2)

看起来好像objects将以nil的形式返回。首先检查nil:

if !error {
    if let actualObjects = objects {
        let possibleUser = (actualObjects as NSArray).lastObject as? PFUser
        if let user = possibleUser {
            cell.usernameLabel.text = user.username
            // ...
        }
    }
}

注意:我将您的as更改为as?lastObject已经返回一个Optional,因此如果最后一个对象无法转换为PFUser,您也可以继续执行。另外,由于lastObject可能会返回nil,因此您还需要检查nil

答案 1 :(得分:0)

要避免此错误,必须在声明Object时确保一个导入事物:

var isActive: Bool?

?是很重要的,所以现在您可以随时检查nil值,访问名为isActive的变量,如下所示:

  1. if isActive == nil
  2. if let _isActive = isActive as Bool?
  3. 因此必须使用?声明Optional值。