2015-04-09 8 views
0

У меня есть 2 функции:Как запустить функции синхронно?

var path = [Int]() 

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
    var selectedRow = tableView.indexPathForSelectedRow()!.row 
    path.append(selectedRow) 
} 

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    var secondController: SecondViewController = segue.destinationViewController as SecondViewController 
    println(path) 

} 

Так что, когда я выбираю строку его в первых оттисков ам пустой массив ([]) для меня, и только потом его распечатать, какая строка я выбрал. Как я могу поместить выделенный индекс строки в массив и распечатать его?

+0

у вас нет для вызова 'tableView.indexPathForSelectedRow()', поскольку он уже передан в параметрах ('indexPath') – Crazyrems

+0

@Crazyrems Проблема не в том, что он использует' indexPathForSelectedRow', а не ищет его с помощью 'sender'. Проблема в том, что 'prepareForSegue' называется _before_' didSelectRowAtIndexPath'. Если он использовал существующий код, но использовал 'sender' вместо' indexPathForSelectedRow', у него все равно была бы та же проблема, что и сейчас. Проблема в том, что они называются порядком, а не тем механизмом, который он использовал для идентификации выбранной строки. – Rob

+0

@Rob Конечно. Просто совет. Мой комментарий не был предназначен для ответа на вопрос. – Crazyrems

ответ

0

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

Чтобы получить контроль над порядком, в котором они выполняются, не прикрепляйте свой сегмент к ячейке. Вместо этого присоедините segue к контроллеру представления и назовите его идентификатором.

Затем в didSelectRowAtIndexPath, вызовите ваш SEGUE вручную с помощью `performSegueWithIdentifier: отправитель:»

+0

Я использовал его с идентификатором, но он падает с «не имеет никакого сегмента с идентификатором« тело ». Я попытался с помощью: 'path.append (selectedRow) if path.count! = 0 { self.performSegueWithIdentifier (" body ", sender: tableView) }' и 'if segue.identifier ==" body "{ вар secondController: SecondViewController = segue.destinationViewController в SecondViewController Println (путь) //secondController.rowIndex.text = "\ (путь [0])" } ' –

0

Вы, видимо, осуществивших didSelectRowAtIndexPath, а также подключили SEGUE из клетки. Проблема в том, что оба они увольняются, но сеанс инициируется до вызова didSelectRowAtIndexPath.

Я предлагаю полностью удалить didSelectRowAtIndexPath, а вместо этого переместить логику indexPathForSelectedRow в prepareForSegue.

+0

Если вызвать переход на клеточной селекции, что клетка передается в 'sender', так что всегда есть способ получить ваш indexPath с помощью' -tableView.indexPathForCell (UITableViewCell) -> NSIndexPath? ' – Crazyrems

+0

Конечно, если вы хотите сделать все это программно, вы можете удалить segue из ячейки, реализовать 'didSelectRowAtIndexPath', подключить и написать' IBAction', и иметь это e 'sender', чтобы определить« ячейку », а затем программно перейти к следующей сцене (например,'performSegueWithIdentifier' или' instantiateViewControllerWithIdentifier'). Но это больше, чем стоит, ИМХО. OP уже использует 'indexPathForSelectedRow', который отлично работает в' prepareForSegue' и 'sender' не нужен, и я думаю, что это проще. Но оба метода работают. – Rob

+0

Я использовал его с идентификатором, но он падает с «не имеет никакого сегмента с идентификатором« тело ». Я попытался с помощью: path.append (selectedRow), если path.count! = 0 {self.performSegueWithIdentifier ("body", sender: tableView)} 'и' if segue.identifier == "body" {var secondController: SecondViewController = segue.destinationViewController as SecondViewController println (path) //secondController.rowIndex.text = "\ (path [0])"} '. –

0
  1. Удаление SEGUE подключения ячейки таблицы ко второму контроллеру
  2. вида Создайте еще один SEGUE неподключенного вида на 2-ое одно, придав ему имя идентификатора (например, «mySegue»)
  3. Добавить performSegueWithIdentifier звоните в didSelectRowAtIndexPath

Вот код:

var path = [Int]() 

    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
    var selectedRow = tableView.indexPathForSelectedRow()!.row 
    path.append(selectedRow) 
    self.performSegueWithIdentifier("mySegue", sender: self) 

    } 

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if (segue.identifier == "mySegue") { 
     var secondController: SecondViewController = segue.destinationViewController as SecondViewController 
     println(path) 
    } 

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