#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 positionindexPath.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 с этим идентификатором и не столкнуться с фатальной ошибкой.