PerformSegueWithIdentifier: неожиданно найдено nil при развертывании необязательного значения

Я хочу разрешить выбор определенной строки, в результате чего произойдет действие, описанное ниже:

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

    tableView.deselectRowAtIndexPath(indexPath, animated: true)

        // Ensure controller knows which dataset to pull from,
        // so detail view is correct
        var friendChat: Friend!

        friendChat = mappedFriends[indexPath.row]

        // Now set the conditional cases: if a friend then chat, if user then friend request if not user then can invite them:
        if(friendChat.statusSort == 2) {

            var controller : IndividualChatController!

            print(friendChat.name)

            controller.friendChat? = friendChat
            controller.senderId? = Global.sharedInstance.userID
            controller.senderDisplayName? = Global.sharedInstance.userName

            self.performSegueWithIdentifier("showIndividualChat",sender: controller)

        } else
            if (friendChat.statusSort == 1) {

            print("Can invite to be friend")

        } else if (friendChat.statusSort == 0) {

            print("Invite to Feast")

        }

}

Тем не менее, во время назначения, из:

            controller.friendChat? = friendChat
            controller.senderId? = FeastGlobal.sharedInstance.userID
            controller.senderDisplayName? = FeastGlobal.sharedInstance.userName

Появляется ошибка: fatal error: unexpectedly found nil while unwrapping an Optional value.

Почему это может произойти? Как это можно облегчить?


person Sauron    schedule 02.06.2016    source источник


Ответы (1)


Вы объявляете, но не присваиваете значение переменной controller здесь:

var controller : IndividualChatController!

Вы обещаете, что это не nil, устанавливая неявно развернутый необязательный тип с восклицательным знаком, то есть IndividualChatController!

Однако это обещание не выполняется, потому что ему не присвоено значение, и оно фактически равно нулю во время выполнения этого кода:

controller.friendChat? = friendChat

Вот почему вы получаете фатальную ошибку.

Исправление состоит в том, чтобы присвоить значение переменной controller при ее объявлении. Например:

var controller:IndividualChatController = IndividualChatController()
person Daniel Hall    schedule 02.06.2016
comment
См. вопрос: stackoverflow.com/questions/37581531/, он точно отображает разрешение - person Sauron; 02.06.2016
comment
@ Саурон, я вижу. Возможно, тогда вам следует удалить этот вопрос. Вопрос, на который вы ссылаетесь, имеет другую проблему и другой код, представленный в вопросе. Этот вопрос здесь спрашивает, почему вы получаете фатальную ошибку, о чем я говорил в своем ответе. Вопрос, на который вы ссылаетесь выше, касается передачи данных через переход, который имеет другой правильный ответ на эту проблему. - person Daniel Hall; 02.06.2016