2016-04-03 2 views
0

Я застреваю, пытаясь передать параметр между двумя UITableViews в XCode с Swift.Как передать данные между двумя UITableViewControllers в Swift?

Я видел несколько вопросов, заданных здесь, но, хотя я и следовал инструкциям, я все еще застрял.

Я установил свою раскадровку. У меня была проблема, потому что большая часть руководства, которое я нашел, использовал «Show» Segue, но по какой-то причине я могу использовать только «Push» Segue. Там нет никакого способа, я могу перетащить и создать «Показать» SEGUE (возможно потому, что я использую Mac с помощью удаленного рабочего стола на Windows, и Mac не понимая Ctrl/Command Key?)

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
    selectedIndex = indexPath.row 
} 

override func prepareForSegue(segue: (UIStoryboardSegue!), sender: AnyObject!) { 
    if (segue.identifier == "secondSegue") { 
    let controller = segue.destinationViewController as! SecondViewController 
    controller.valuePassed = selectedIndex 
    } 
} 

Даже если это работает , по какой-то причине прошедший индекс никогда не является текущим. Вместо этого индекс, полученный на втором экране, является предыдущим выбранным.

Я также пробовал использовать «performSegueWithIdentifier», но при этом мой второй экран открывается дважды, когда я нажимаю элемент. Я предполагаю, что это связано с тем, что между ними существует ссылка «Push», а также «performSegueWithIdentifier».

Я не знаю, как создать идентификатор Segue, не связывая оба экрана на раскадровке.

Итак, я не уверен, что мой код неправильный, если мне нужно каким-то образом создать «Show» Segue (я действительно новичок в программировании на iOS, и я не знаю фактической разницы между Push и Show on контекст UITableView). Если мне нужно каким-то образом создать идентификатор Segue, не связывая экраны на раскадровке и т. д. ... Я действительно застрял и вышел из идей.

Цените любую помощь. Благодарю.

+0

«Шоу» - это то, что они называют «Push» segues сейчас, насколько я знаю. Итак, ты хороший. –

+2

'prepareForSegue' вызывается перед' didSelectRowAtIndexPath'. Если вы хотите получить выбранный индекс в 'prepareForSegue', то получите его через' tableView.indexPathForSelectedRow.row' – dan

+1

Я думаю, что здесь происходит то, что, поскольку вы связали thg segue от ячейки к VC, когда вы выберете ячейку, она сначала вызовет the prepareforsegue, а затем selectedIndex = indexPath.row. Поэтому вместо того, чтобы связывать segue со ссылкой на ячейку с VC на VC и в didselect вызывать executeSegueWithIdentifier. –

ответ

2

Если вы хотите использовать performSegueWithIdentifier, перетащите элемент segue из контроллера вида, а не из ячейки таблицы. В противном случае, как вы сказали, он срабатывает дважды.

Вместо хранения выбранногоIndex вы можете просто получить его из вида таблицы, используя UITableViewindexPathForSelectedRow. Он возвращает необязательный параметр, поэтому обязательно разверните его соответствующим образом.

+0

Вот еще одно сообщение, в котором приводятся несколько примеров передачи контроллеров представлений данных, которые также могут быть полезны: http://stackoverflow.com/questions/5210535/passing-data-between-view-controllers?rq=1 – xdeleon

0

Попробуйте то, что было сказан выше Тим и изменить код prepareForSegue на это:

if segue.identifier == "secondSegue" { 

     let destinationVC : SecondViewController = segue.destinationViewController as! SecondViewController 

     // you can now pass whatever data you need to to the next view controller ... for example: destinationVC.dogName = dogName 

    } 

Надеется, что это помогает!

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