2015-11-18 4 views
0

У меня есть tableView, отображающий список ячеек. Мне нужно поймать выбранную ячейку и передать мои данные объекта на основе indexPath.row, чтобы отобразить ее на моем втором контроллере просмотра. Мой didSelectRowAtIndexPath работает нормально, но, вероятно, я не знаком с синтаксисом для performSegueWithIdentifier, где он не может вызвать метод.didSelectRowAtIndexPath и performSegueWithIdentifier

Извините, что я новичок в программировании Swift, был бы признателен, если бы вы могли объяснить более подробную информацию.

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath){ 
    selectedCell = indexPath.row 
    performSegueWithIdentifier("DetailScreen", sender: self) 
} 

override func performSegueWithIdentifier(identifier: String, sender: AnyObject?) { 
    detailedView.personName = personList[selectedCell].GetPersonName() 
} 

ответ

1

Решение 1

Во-первых, убедитесь, что у вас есть SEGUE между вашим первым и вторым контроллерами отображения (от контроллера одного вида таблицы на экране просмотра Detail). Убедитесь в том, что переход имеет имя

enter image description here

Сейчас в didSelectRowAtIndexPath случае вашего первого контроллера представления, Призовите SEGUE как это.

performSegueWithIdentifier("DetailScreen", sender: nil) 

Сейчас в prepareForSegue способе первого контроллера представления, вы можете настроить его, чтобы отправить более подробную информацию.

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
{  
    if(segue.identifier=="DetailScreen") 
    { 
    let ctrl = segue.destinationViewController as! YourDetailsViewController 
    ctrl.personName = "Set some person name here" 
    } 
} 

Предполагая, что класс вашего Detail экрана называется YourDetailsViewController и имеет свойство personName типа String. Вы можете обновить код, чтобы использовать свой реальный контроллер просмотра.

Решение 2

Если вы не хотите, чтобы создать SEGUE, можно программно перемещаться (фактически толкая второй контроллер представления к фронту) на второй взгляд. В своих первых контроллерах зрения, метод didSelectIndexPathAtRow,

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath){ 

    let ctrl = self.storyboard?.instantiateViewControllerWithIdentifier("DetailsCtrl") 
             as? YourDetailsViewController 

    ctrl?.personName="Set some name here" 

    self.navigationController?.pushViewController(ctrl!, animated: true) 
} 

Для приведенного выше кода, чтобы работать, вы должны убедиться, что у вас есть StoryBoardID установлен в «DetailsCtrl» на втором контроллере представления (Подробности просмотра)

enter image description here

+0

Привет, я последовал за то, что вы сказали, но я получил эту ошибку People_Project [1277: 71769] ***, истекающее приложение из-за неперехваченное исключение 'NSInvalidArgumentException', причина: «Receiver () не имеет значения с идентификатором 'DetailScreen' ' –

+0

Просто для подтверждения, 'performSegueWithIdentifier (« DetailScreen », отправитель: nil)' находится на моем втором контроллере просмотра? Потому что оба находятся в разных классах. Который я думаю причину к проблеме. –

+0

@JoeLeong См. Мой обновленный ответ, который отвечает на ваши вопросы – Shyju

0

Вы установили раскадровки SEGUE, как указано ниже:

Нажмите на Segue и добавить идентификатор

enter image description here

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

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath){ 
     let storyboard1 = UIStoryboard(name: "Main", bundle: nil) 

     let detail = storyboard1.instantiateViewControllerWithIdentifier("DetailScreen") as! SecondViewController 
     detail.personName = personList[selectedCell].GetPersonName() 
     self.navigationController?.pushViewController(detail, animated: true) 
} 

Раскадровка переход от первого контроллера представления на второй контроллер представления должен быть «Нажмите».

Надеюсь, это может быть полезно.

+0

набор, но все тот же вопрос. –

+0

Я обновил ответ, на самом деле вам нужно установить идентификатор segue. – Karlos

+0

Это «работает», но это не правильно. Что происходит, это заставляет 'prepareForSegue' запускаться в' if (segue.identifier == "DetailScreen") 'для выполнения, а затем в' didSelectRowAtIndexPath' он снова запускает 'prepareForSegue'. Теперь я вижу физически, что SecondViewController загружается дважды. –

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