Передача значений между 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
установлен?