2015-07-26 3 views
0

У меня есть UITableViewController и два UIViewController. Каждый контроллер имеет UINavigationController. Я сделал два segue первый от UITableViewCell, а второй от UIBarButtonItem с помощью раскадровки. Когда я перехожу из UITableViewCell, у меня есть успех, но когда я перехожу от UIBarButtonItem, я получаю сообщение об ошибке «фатальная ошибка: неожиданно найден nil при распаковке необязательного значения». enter image description hereошибка segue в Xcode 6

Еще я сделал код в коде. Этот код

@IBAction func addMusic(sender: UIBarButtonItem) { 
    performSegueWithIdentifier("addMusic", sender: self) 
} 



override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
     tableView.selectRowAtIndexPath(indexPath, animated: true, scrollPosition: UITableViewScrollPosition.None) 
     performSegueWithIdentifier("listenMusic", sender: nil) 
    } 

Эта ошибка enter image description here

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

    var indexPath = tableView.indexPathForSelectedRow() 
    var nameOfObjectForPass = listOfMP3Files![indexPath!.row] // default it's name and 
    var fileManager = NSFileManager.defaultManager() 

    var wayToFile = fileManager.URLsForDirectory(NSSearchPathDirectory.DocumentDirectory, inDomains: NSSearchPathDomainMask.UserDomainMask) 
    var passMusicFileURL: NSURL? // for pass mp3 

    if let documentPath: NSURL = wayToFile.first as? NSURL { 
     let musicFile = documentPath.URLByAppendingPathComponent(nameOfObjectForPass) 
     println(musicFile) 
     passMusicFileURL = musicFile 
    } 

    var currentTrackPath = tableView.indexPathForSelectedRow()! 

    var allIndexTable = tableView.indexPathsForVisibleRows()! as! [NSIndexPath] 

    var currentIndexPath = tableView.indexPathForSelectedRow()!.row 

    if segue.identifier == "listenMusic" { 
     var playerVC = (segue.destinationViewController as! UINavigationController).topViewController as! PlayMusicViewController 
     playerVC.nameMusicFile = nameOfObjectForPass // name 
     playerVC.mp3URL = passMusicFileURL 

     // test 
     playerVC.currentPath = currentTrackPath 

     playerVC.allIndex = allIndexTable 
     // 
     playerVC.currentIndex = currentIndexPath 
     // variant the second 
     var curRow = tableView.indexPathForSelectedRow()!.row 
     playerVC.arrayOfMP3 = listOfMP3Files 
     playerVC.currentRow = curRow 
    } else if segue.identifier == "add" { 
     var avc = (segue.destinationViewController as! UINavigationController).topViewController as! AddViewController 
    } 
} 
+0

Можете ли вы показать нам код внутри '' переопределение функ prepareForSegue (Segue: UIStoryboardSegue, отправитель: AnyObject?) '' ' –

+0

В Tableview: didSelectRowAtIndexPath' вы повторного выбора строки? Зачем? С другой стороны, я не уверен, что это напрямую связано. Вы нажали Ctrl + Drag с кнопки или прямо с контроллера? Если вы сделали это с помощью кнопки, вам не нужно создавать розетку и выполнять сеанс. Может быть, вы выполняете сеге дважды в этом случае. Другое, что я вижу здесь, также в том, что у вас есть два контроллера навигации в одном стеке. Поскольку Song View View Controller уже находится в контроллере навигации, вам не нужно нажимать другой контроллер навигации в стеке. – Legoless

+0

@ JulianJ.Tejera Да, я могу – Alexander

ответ

1

Если не был выбран предварительно любая строка tableView.indexPathForSelectedRow() вернет ноль, и это приведет к краху его этой линии var nameOfObjectForPass = listOfMP3Files![indexPath!.row].

Попробуйте обернуть свои операции внутри каждого условного оператора.

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if segue.identifier == "listenMusic" { 
     var indexPath = tableView.indexPathForSelectedRow() 
     var nameOfObjectForPass = listOfMP3Files![indexPath!.row] // default it's name and 
     var fileManager = NSFileManager.defaultManager() 

     var wayToFile = fileManager.URLsForDirectory(NSSearchPathDirectory.DocumentDirectory, inDomains: NSSearchPathDomainMask.UserDomainMask) 
     var passMusicFileURL: NSURL? // for pass mp3 

     if let documentPath: NSURL = wayToFile.first as? NSURL { 
      let musicFile = documentPath.URLByAppendingPathComponent(nameOfObjectForPass) 
      println(musicFile) 
      passMusicFileURL = musicFile 
     } 

     var currentTrackPath = tableView.indexPathForSelectedRow()! 

     var allIndexTable = tableView.indexPathsForVisibleRows()! as! [NSIndexPath] 

     var currentIndexPath = tableView.indexPathForSelectedRow()!.row 
     var playerVC = (segue.destinationViewController as! UINavigationController).topViewController as! PlayMusicViewController 
     playerVC.nameMusicFile = nameOfObjectForPass // name 
     playerVC.mp3URL = passMusicFileURL 

     // test 
     playerVC.currentPath = currentTrackPath 

     playerVC.allIndex = allIndexTable 
     // 
     playerVC.currentIndex = currentIndexPath 
     // variant the second 
     var curRow = tableView.indexPathForSelectedRow()!.row 
     playerVC.arrayOfMP3 = listOfMP3Files 
     playerVC.currentRow = curRow 
    } else if segue.identifier == "add" { 
     var avc = (segue.destinationViewController as! UINavigationController).topViewController as! AddViewController 
    } 
} 
+0

Я сделал это, вы посмотрите на мой код. – Alexander

+0

Перед операциями if вы вызываете 'tableView.indexPathForSelectedRow()!' '. Возможно, не будет выделенной строки, переместите ее в музыкальный блок «listenMusic». В основном, переместите все выше, если внутри оператора '' listenMusic''. –

+0

Но работа с UITableViewCell очень хорошая. И переход из UIBarButtonItem дает ошибку – Alexander

-1

Изменить это ..

performSegueWithIdentifier("listenMusic", sender: nil) 

Для

performSegueWithIdentifier("listenMusic", sender: self // or if its button then make it button) 
+0

Я сделал, как вы писали, но он также дал то же самое ошибка. – Alexander

+0

Я только не могу перейти от кнопки – Alexander

+0

Вы назвали весь идентификатор segue и не забудьте использовать одно и то же имя сегмента, которое вы перетаскивали из UIBarButtonItem в код тоже. –

-1

Попробуйте этот код

@IBAction func addMusic(sender: UIBarButtonItem) { 
    performSegueWithIdentifier("add", sender: sender) 
} 
+0

попробуйте этот новый код –

+0

Я повторно отредактировал идентификатор segue здесь becuz, вы сказали, что имя идентификатора segue - «добавить», но измените его, если вы измените идентификатор segue в будущем –

+0

Эй, вы не изменили параметр отправителя на отправителя , Сделайте это отправителем: отправитель –

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