Передача значений между ViewControllers на основе выбора списка в Swift

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

По сути, в didSelectRowAtIndexPath я задаю переменную seta, которая затем выбирается в prepareForSegue. Проблема в том, что prepareForSegue, похоже, запускает второе, когда ячейка выбрана, и до вызова функции didSelectRowAtIndexPath, поэтому моя переменная не передается.

Мои основные части кода:

tableView didSelectRowAtIndexPath делегат, который устанавливает 'selectedResult'...

func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!) {
    selectedResult = indexPath.item
    txtNameSearch.resignFirstResponder()    //get rid of keyboard when table touched.
    println("saved result")


    //tableView.deselectRowAtIndexPath(indexPath, animated: false)
    //var tappedItem: ToDoItem = self.toDoItems.objectAtIndex(indexPath.row) as ToDoItem
    //tappedItem.completed = !tappedItem.completed
    //tableView.reloadData()

}

Функция prepareForSegue, которая отправляет переменную как toPass другому ViewController (detailViewController):

override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!){
    if (segue.identifier == "detailSeque") {
        println("preparing")
        var svc = segue!.destinationViewController as detailViewController
        svc.toPass = selectedResult

        //println(tableView.indexPathsForSelectedRows().
        //svc.toPass = tableView.indexPathForSelectedRow()

    }
}

заранее спасибо

2 ответа

Решение

Если у вас есть выход к вашему столу в вашем ViewControllerВы можете просто позвонить indexPathForSelectedRow в prepareForSegue,

Если твой ViewController это подкласс UITableViewControllerтогда вы можете сделать:

    let row = self.tableView.indexPathForSelectedRow().row
    println("row \(row) was selected")

Если твой ViewController не подкласс UITableViewControllerустановить IBOutlet к UITableView на ваш взгляд контроллер:

@IBOutlet var tableView: UITableView!

и подключить это в Интерфейсном Разработчике и вызвать его из prepareForSegue как показано выше.

Вместо того, чтобы инициировать переход непосредственно от действия раскадровки, почему бы вам не попробовать программно вызвать performSegueWithIdentifier в вашем didSelectRowAtIndexPath метод, после selectedResult установлен?

Другие вопросы по тегам