2015-09-21 3 views
0

Я хочу, чтобы подготовить свой SEGUE через:Swift PrepareForSegue NSIndexPath ошибка

override func prepareForSegue(segue: UIStoryboardSegue?, sender: AnyObject?) { 
    if segue?.identifier != "fromOpenChatsToLogIn" { 
     if let controller: ChatViewController? = segue?.destinationViewController as? ChatViewController { 
      if let cell: onlineUserCell? = sender as? onlineUserCell { 
       let user = OneRoster.userFromRosterAtIndexPath(indexPath: tableView.indexPathForCell(cell!)!) 
       controller!.recipient = user 
      } 
     } 
    } 
} 

где onlineUserCell это мой пользовательский элемент. Кроме того, это мой userFromRosterAtIndexPath:

class func userFromRosterAtIndexPath(indexPath indexPath: NSIndexPath) -> XMPPUserCoreDataStorageObject { 
    return sharedInstance.fetchedResultsController()!.objectAtIndexPath(indexPath) as! XMPPUserCoreDataStorageObject 
} 

так, когда я выбираю мою камеру он выходит из строя с:

fatal error: unexpectedly found nil while unwrapping an Optional value 

на линии:

let user = OneRoster.userFromRosterAtIndexPath(indexPath: tableView.indexPathForCell(cell!)!) 

Что не так? Как я могу это исправить?

ответ

2

Прежде всего, Swift ввел определение типа, а также лучшие практики, чтобы правильно его использовать, так что писать код, как этот

if let controller = segue?.destinationViewController as? ChatViewController { 
    if let cell = sender as? onlineUserCell { 
    } 
} 

Кроме того, вы должны установить точки останова исключения в Xcode (here), чтобы более четко видеть, где вы терпите крах.

В вашем случае это было в

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

Вы должны использовать следующее заявление:

if segue.identifier == "fromOpenChatsToLogIn" { 
} else { 
} 

Ваш Логин ViewController не требуется пользователю, поэтому он разбился на

let user = OneRoster.userFromRosterAtIndexPath(indexPath: tableView.indexPathForCell(cell)!) 

Потому что нет cell, а sender в prepareForSegue определенно НЕ ячейка.

Для вас второй вопрос, исправить было легко.

Вы отправляете OneRoster.userFromRosterAtIndexPath(indexPath: indexPath) в

performSegueWithIdentifier("fromUsersListToChatView", sender: OneRoster.userFromRosterAtIndexPath(indexPath: indexPath)) 

Так что вам не нужна клетка или что-нибудь, так как у вас уже есть user объект!

Установите recipient так:

controller?.recipient = sender as? XMPPUserCoreDataStorageObject 

Просто замените ваш метод prepareForSegue к следующему, и он будет работать:

if segue.identifier == "fromOpenChatsToLogIn" { 
} else { 
    let controller = segue.destinationViewController as? ChatViewController   
    controller?.recipient = sender as? XMPPUserCoreDataStorageObject 
} 
0

Просто проверьте, погода ваш cell является nil или ваш userFromRosterAtIndexPath возвращение nil

+0

'Ро cell' возвращает' nil' –

+0

ли вы проверить, что ' отправитель' есть? Я думаю, это не ячейка, поэтому она не передает ваш 'как?' – AncAinu

+0

, как я могу проверить 'sender'? с 'po sender' он возвращает' nil'. В другом моем проекте я не использовал 'sender', но здесь я взял его из репозитория GitHub и попытался изменить его с помощью своей пользовательской ячейки, поэтому он теперь сбрасывает –

0

Мой совет будет устанавливать метки на каждую ячейку, а затем в методе prepareForSegue, получить ячейку, получить метку, а затем настроить код userFromRosterAtIndexPath вместо этого. Это значение тега может быть номером строки ячейки. Смотрите, если это имеет смысл в вашем контексте.

+0

он возвращает 'Инициализатор для условного связывания должен иметь необязательный тип, а не ошибку« NSIndexPath'' –

+0

My bad - здесь 'indexPath' всегда будет иметь некоторое значение. Не могли бы вы попробовать один раз с тегом, который я предложил выше. – Abhinav

0

Проверьте отливку таким образом.

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if segue.identifier == "PhotoScrollerViewController" { 
     if let controller = segue.destinationViewController as? PhotoScrollerViewController { 
      var cell:UICollectionViewCell = (sender as? UICollectionViewCell)! 

      //Code here 
     } 
    } 
}