2016-10-03 3 views
0

Я хочу, чтобы перейти от одного контроллера вида к другому и отправить USERID:Swift подготовиться к Segue - Отправка данных из одного контроллера представления другого

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 

    } 

, нажав я получаю: «неустранимую ошибку: неожиданно обнаружил всухую время Развертывание необязательного значения « что я делаю неправильно?

+0

В какой строке выполняется перерыв? –

+0

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

+0

selectedPerson! .userID = self.usersArray [indexPath.row] .userId - фатальная ошибка –

ответ

0

Выполняя segue, передайте 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 
    } 
} 
0

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

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

2

Если вы дали SEGUE в раскадровке НЕ Вызывайте эту self.performSegueWithIdentifier ("chosenPerson", отправитель: самостоятельно) метод в didSelectItem

Если вы дали SEGUE в раскадровке переопределение функ prepareForSegue - этот метод вызывает первый после этого didSelectItem называет

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

Я думаю, что проблема заключается в self.usersArray [indexPath.r вл] .userId мая этого возвращает ноль

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 

     } 




    } 
} 

enter image description here

 Смежные вопросы

  • Нет связанных вопросов^_^