基于Swift中的列表选择在ViewControllers之间传递值

时间:2014-08-18 16:51:34

标签: swift tableview segue viewcontroller

我正在尝试将listView选择的所选索引号从一个ViewController传递到另一个ViewController,但遇到问题时,tableView didSelectRowAtIndexPath委托比prepareForSegue函数稍晚运行。

基本上,在didSelectRowAtIndexPath中,我选择了变量,然后在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 个答案:

答案 0 :(得分:11)

如果您在ViewController的桌面视频中有一个插座,则可以在indexPathForSelectedRow中拨打prepareForSegue

如果您的ViewControllerUITableViewController的子类,那么您可以这样做:

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

如果您的ViewController不是UITableViewController的子类,请在视图控制器中为IBOutlet设置UITableView

@IBOutlet var tableView: UITableView!

并在Interface Builder中连接并从prepareForSegue调用它,如上所示。

答案 1 :(得分:0)

在设置performSegueWithIdentifier之后,为什么不尝试以编程方式在didSelectRowAtIndexPath方法中调用selectedResult,而不是直接从故事板操作触发您的segue?