Быстрая подготовка к переходу — отправка данных с одного контроллера представления на другой

#swift #collectionview

#быстрая #collectionview

Вопрос:

Я хочу перейти с одного контроллера представления на другой и отправить идентификатор пользователя:

 func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
    self.performSegueWithIdentifier("chosenPerson", sender: self)
}

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

    if segue.identifier == "chosenPerson" {

        let chosenPerson = segue.destinationViewController as? chosenPersonViewController
        let indexPaths = self.collectionView!.indexPathsForSelectedItems()!
        let indexPath = indexPaths[0] as NSIndexPath

        chosenPerson!.userID = self.usersArray[indexPath.row].userId

    }
  

нажав, я получаю: «фатальная ошибка: неожиданно обнаружено значение nil при развертывании необязательного значения»
что я делаю не так?

Комментарии:

1. На какой строке прерывается время выполнения?

2. Всего несколько советов, чтобы вы начали. Попробуйте пройти по строкам в вашей if sentence строке за строкой, чтобы получить представление о том, что происходит. Потенциальными кандидатами на сбой являются self.collectionView!.indexPathsForSelectedItems()! , и chosenPerson!.userID = self.usersArray[indexPath.row].userId поэтому постарайтесь indexPathsForSelectedItems() убедиться, что возвращает что-то полезное и что ваш usersArray on position indexPath.row действительно что-то содержит.

3. Выбранный пользователь! .userId = self.usersArray[indexPath.row].userId — фатальная ошибка

4. Ах … ну вот и все 🙂 Кажется, что ваше usersArray значение не соответствует indexPath.row . Можете ли вы убедиться, что это действительно проблема?

5. Это означает, что ваш объект ViewController chosenPerson равен нулю, проверьте в раскадровке chosenPerson переход, вместо которого он должен быть связан с каким-либо другим контроллером chosenPersonViewController .

Ответ №1:

Если вы указали переход в раскадровке, НЕ вызывайте этот метод self.performSegueWithIdentifier(«Выбранный пользователь», отправитель: self) в didSelectItem

Если вы указали segue в функции переопределения раскадровки prepareForSegue — этот метод вызывается первым после этого didSelectItem вызывает

Пожалуйста, обратитесь к раскадровке один раз (ниже изображение для примера)

Я думаю, что проблема в self.usersArray[indexPath.row].Идентификатор пользователя Может возвращать ноль

Swift2:

 self.performSegueWithIdentifier("chosenPerson", sender: self)
  

Swift3:

 self.performSegue(withIdentifier: "chosenPerson", sender: self)
  

Swift2:

 override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

if segue.identifier == "chosenPerson" {

    let chosenPerson = segue.destinationViewController as? chosenPersonViewController
    let indexPaths = self.collectionView!.indexPathsForSelectedItems()!
    let indexPath = indexPaths[0] as NSIndexPath

    chosenPerson!.userID = self.usersArray[indexPath.row].userId //May it found nil please re - check array values

}
  

Swift3:

 override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    if segue.identifier == "chosenPerson" {

        let chosenPerson = segue.destination as! chosenPersonViewController

        if let indexPath = collectionView.indexPathForSelectedItem {

        chosenPerson!.userID = self.usersArray[indexPath.row].userId //May it found nil please re - check array values

        }




    }
}
  

введите описание изображения здесь

Ответ №2:

При выполнении перехода передайте indexPath в качестве отправителя и попробуйте использовать этот оператор switch . Если при "unknown segue" выборе ячейки отображается «распечатано», контроллер назначения не имеет типа chosenPersonViewController .

 func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {

    performSegueWithIdentifier("chosenPerson", sender: indexPath)
}

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

    switch (segue.destinationViewController, sender) {
    case (let controller as chosenPersonViewController, let indexPath as NSIndexPath):
        controller.userID = usersArray[indexPath.row].userId
    default:
        print("unknown segue")
        break
    }
}
  

Ответ №3:

Одна из возможных проблем может заключаться в том, что в вашей раскадровке вы не установили идентификатор для вашего перехода как «chosenPerson». Чтобы исправить это, сначала убедитесь, что у вас есть переход между первым и вторым контроллерами представления, который может быть создан путем перетаскивания элемента управления с одного контроллера представления на другой.

Затем убедитесь, что у перехода есть идентификатор, а именно: «Выбранный пользователь». Для этого: нажмите на переход между первыми двумя контроллерами представления, затем перейдите на вкладку атрибуты, а затем установите в поле идентификатор значение «Выбранный пользователь». Сохраните раскадровку с вашими изменениями, и теперь вы сможете вызвать prepareForSegue с этим идентификатором и не столкнуться с фатальной ошибкой.