2016-12-25 15 views
3

В настоящее время я изучаю Swift и пытаюсь выполнить segue, когда пользователь нажимает на одну из ячеек таблицы, которую представляет приложение. В настоящий момент, когда пользователь выполняет это действие, следующий контроллер представления загружается успешно, но кажется, что по какой-то причине я не могу получить доступ к каким-либо элементам пользовательского интерфейса, поскольку каждый раз, когда я пытаюсь это сделать, я в конечном итоге получаю эту ошибку:Проблема при выполнении segue на ячейке tableview

фатальная ошибка: неожиданно нашли ноль в то время как разворачивание необязательное значение

точки ошибки в строке, в которой я пытаюсь изменить текст одной из меток, которые отображаются на следующий контроллер вида

Это didSelectRowAt функция:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath){ 
    self.performSegue(withIdentifier: "segue1", sender: self) 
} 

и это prepareForSegue функция:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "segue1" { 
     let destinationVC = segue.destination as! UserViewController 
     let selectedRow = tableView.indexPathForSelectedRow! 
     let selectedCell = tableView.cellForRow(at: selectedRow) as! CustomCell 

     destinationVC.usernameLabel.text = selectedCell.userName.text //this is where the error is pointing to 
     destinationVC.bioLabel.text = selectedCell.bio.text 
     destinationVC.userImage.image = selectedCell.photo.image 

    } 
} 

Я понятия не имею о том, что является причиной этой проблемы. Моя цель - передать данные из подключенной ячейки в следующий контроллер представления, но это, очевидно, мешает мне это сделать. Кто-нибудь знает, как я могу это исправить? Заранее спасибо.

+0

Hi, Mike. Используете ли вы статичные или динамические ячейки 'UITableView'? –

+0

Я использую динамические ячейки. –

+0

@Mike Vaugh, используйте 'destinationVC.usernameLabel.text = selectedCell.userName.text ?? "" – aircraft

ответ

2

Примечание: Я предположил, что userName и bio оба UITextField s

Почему бы вам не попробовать что-то вроде этого?

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "segue1" { 
     let destination = segue.destination as! UserViewController 
     // Use of optional binding to make sure an indexPath exists 
     if let indexPath = tableView.indexPathForSelectedRow { 
      let cell = tableView.cellForRow(at: IndexPath(row: indexPath.row, section: indexPath.section)) as! CustomCell 
      // Notice how we are not directly updating the label as before. 
      destination.usernameText = cell.userName?.text 
      destination.bioText = cell.bio?.text 
     } 
    } 

} 

Сейчас в UserViewController:

@IBOutlet weak var usernameLabel: UILabel! 
@IBOutlet weak var bioLabel: UILabel! 
// What we will be passing the text to instead. 
var usernameText: String? 
var bioText: String? 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // update the labels with the text from the proper cell. 
    usernameLabel?.text = usernameText 
    bioLabel?.text = bioText 
} 

Вы можете просто сделать то же самое для вашего изображения, просто разные типы.Это связано с тем, что выходы не выделяются при использовании в prepare(for segue:).

+0

Mate, вы исправил это! Теперь он прекрасно работает. Большое спасибо. Я скоро приму ваш ответ. –

+0

Фантастический! Удачи вам в развитии. @MikeVaugh –

0

У меня была отличная проблема с подготовкой метода segue при попытке сделать то же самое с UICollectionView. Эти 2 очень похожи, поэтому вы можете легко менять коллекцию в tableview.

это то, что я сделал ... используя переменную selectedPack

в контроллере представления вы хотите, чтобы непосредственно перейти к вам нужно установить переменную

// passed packName from PackViewController 
var selectedPack: String! 

затем в ViewController вы выбираете ячейку

public func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 

     // handle the segue to JourneyViewController with variable "selectedPack" 
     // not sure why you need to set the storyboard but it works 
    let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil) 
     //create instance of the viewcontroller 
    let transportJourneyViewController = storyBoard.instantiateViewController(withIdentifier: "JourneyViewController") as! JourneyViewController 
     //value to pass - has been defined in journey 
     transportJourneyViewController.selectedPack = INSERT_YOUR_VALUE_TO_PASS 
     //present the vc 
    self.present(transportJourneyViewController, animated:true, completion:nil) 

} 

JourneyViewController является storyboardID и ИмяКласса из ViewController вы хотите идти to.set в интерфейсе строителя.

Вам также потребуется иметь tableviewdatasource и tableviewdelegate, определенные на верхнем уровне контроллеров представлений и в самой раскадровки.

class JourneyViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate { 
+0

Я в первую очередь хочу исправить проблему с помощью tableview, в частности. Однако использование UICollectionView действительно интересно. Я попробую, если я не смогу сделать это с помощью таблицы. Благодаря! –

+0

просто измените «func collectionView (_ collectionView: UICollectionView» на «func tableView (_ tableView: UITableView» должен работать – Pippo

+0

и, очевидно, делегаты должны будут быть изменены с «UICollectionViewDataSource, UICollectionViewDelegate» на «UITableViewDataSource, UITableViewDelegate» – Pippo