Ячейка TableView коснулась возврата Nil в переходе

Я пытаюсь передать информацию о представлении таблицы в контроллер представления и получаю эту «фатальную ошибку: неожиданно найдено nil при развертывании необязательного значения». Вот мой код.....

  func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
    {
        self.resultsTableView.deselectRowAtIndexPath(indexPath, animated: true)

        dispatch_async(dispatch_get_main_queue()) { () -> Void in
            self.performSegueWithIdentifier("playerSegue", sender: self.resultsTableView)
        }

    }

а также...

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)
{
    if segue.identifier == "playerSegue"
    {
        let index = resultsTableView.indexPathForSelectedRow!.row
        let controller = segue.destinationViewController as! VideoViewController
        controller.vidTitleLBL.text = self.videoTitle[index]
        controller.videoId = self.videoId[index]

    }
}

Он не показывает информацию в indexPath.row. Кроме того, ячейка представляет собой пользовательскую UITableViewCell, а videoTitle и videoId исходят из массива элементов YouTube JSON.


person Charles Jr    schedule 31.10.2015    source источник


Ответы (2)


Вы причинили себе вред, выполнив self.resultsTableView.deselectRowAtIndexPath(indexPath, animated: true) перед переходом.

После отмены выбора строки вы асинхронно выполняете переход. Когда вызывается метод prepareForSegue, resultsTableView.indexPathForSelectedRow уже является nil, потому что вы отменили выбор ранее выбранной строки.

person Eugene Dudnyk    schedule 31.10.2015
comment
Это абсолютно правильно. И, насколько мне известно, асинхронный вызов не обязательно делает значение nil, это тот факт, что, несмотря ни на что, ранее выбранная строка больше не выбрана. - person rb612; 31.10.2015
comment
Хорошо... это был плохой код, который я получил откуда-то еще, пытаясь решить эту проблему. Я удалил его, и он все еще приближается к нулю .... есть мысли? кстати...мой исходный массив ----- var videoTitle = [String]() --- может быть проблема в этом? - person Charles Jr; 31.10.2015
comment
Любые быстрые соглашения? Указав ! вы разворачиваете опции без проверок. Реализуйте проверки на nil, проверьте, где находится nil вместо того, что вы ожидали, и переделайте свой код, чтобы избежать этого. - person Eugene Dudnyk; 31.10.2015

Я исправил это, установив публичный...

var selectedVideoIndex: Int!

didSelectRowAtIndexPath as..... func tableView (tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

    selectedVideoIndex = indexPath.row
    dispatch_async(dispatch_get_main_queue(), {
        self.performSegueWithIdentifier("seguePlayer", sender: self)

    })

}

и подготовить ForSegue как...

 override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)
    {
        if segue.identifier == "seguePlayer"
        {

            print(self.videoTitle[selectedVideoIndex])
            print(self.videoId[selectedVideoIndex])
            let controller = segue.destinationViewController as! VideoViewController
            controller.vidTitleText = self.videoTitle[selectedVideoIndex]
            controller.videoId = self.videoId[selectedVideoIndex]
            controller.vidDescription = self.videoDescription[selectedVideoIndex]
            controller.vidIMG = self.videoIMG[selectedVideoIndex]

        }
    }

Кроме того, поскольку моя информация из словаря YouTube API была преобразована в строки, мне пришлось установить пустые строки в моем VideoViewController и сделать там мои label.text(s) равными им. Если есть лучший способ сделать это, пожалуйста, прокомментируйте ниже.

person Charles Jr    schedule 04.11.2015