如何在prepareForSegue中访问所选单元格中的数据

时间:2015-04-13 04:53:30

标签: swift segue

我试图创建我的第一个segue,并且我想将我选择的tableViewCell中的数据传递给我所选择的辅助视图控制器。

我的问题是:

由于prepareForSegue没有使用indexPath,如何获取有关我选择的特定单元格的信息?

这里是我的应用程序的照片,里面有一些虚拟数据,带右箭头的单元格代表我想要的细胞:

enter image description here

这是我的CustomCell类,这些行派生自:

TimingCell.swift

class TimingCell: UITableViewCell {

    @IBOutlet weak var timingLabel: UILabel!
    @IBOutlet weak var timeSetLabel: UILabel!

    ...
}

这里是我设置segue方法的地方:

ViewController.Swift

class ViewController: UITableViewController, UITableViewDataSource, UITableViewDelegate, SettingCellDelegate {


    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {


    var view: TimeViewController = segue.destinationViewController as! TimeViewController


}

*如果您需要在下面的评论中看到更多代码,请告诉我

4 个答案:

答案 0 :(得分:1)

你可以通过这种方式获得IndexPath

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {


   var view = segue.destinationViewController as! TimeViewController
   if let indexPath = myTableView.indexPathForSelectedRow() {
            view.tempString = indexPath.row.description
        }

}

答案 1 :(得分:1)

所以你应该从UITableViewController而不仅仅是视图控制器。

在UITableViewController中,您需要覆盖:

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // #warning Incomplete method implementation.
    // Return the number of rows in the section.

    return 6 //Looks like you have six rows in your TableView
}

现在需要一个类范围的NSIndexPath变量来跟踪所选行的索引,以便创建变量:

var path = NSIndexPath()

现在你还需要两个覆盖,第一个是在选择一行时设置路径变量,第二个是在选择它后取消选择该行(确保当你从中转换回来时,取消选择动画不会播放子视图控制器):

override func tableView(tableView: UITableView, willSelectRowAtIndexPath indexPath : NSIndexPath) -> NSIndexPath? {
    path = indexPath
    return indexPath
}

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    tableView.deselectRowAtIndexPath(path, animated: true)
}

最后,在prepareForSegue函数中,您可以使用path变量来确定选择了哪一行并相应地设置子视图控制器变量:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    var dest = segue.destinationViewController as! TimeViewController
    if path == 1 {
        //set some destination variables here
    } else {
        //or here
    }
}

如果您有一个数据结构,您可以从中确定表视图中的每一行将包含的内容,只需使用path作为数据结构的索引,并将该行的信息传递给目标视图控制器。例如,像:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    var dest = segue.destinationViewController as! TimeViewController
    dest.rowTitle = myRowsArray[path.row].title
}

表视图有点习惯......祝你好运!

答案 2 :(得分:1)

您可以在tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)功能中设置一些变量。在您尝试访问的视图中设置相同的变量。在prepareForSegue函数中设置值,它将起作用。

以下是我用于我的应用程序的代码。我在didSelectRowAtIndexPath函数中设置了roomUUID,并将其传递给prepareForSegue函数。目标segue视图控制器中也有一个roomUUID变量。

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    println ("Select Row At: \(indexPath.item)")
    // Need to show the view for room information.
    var roomInfo: NSMutableDictionary = self.roomList[indexPath.item] as NSMutableDictionary
    self.roomUUID = roomInfo["uuid"] as String
    self.performSegueWithIdentifier("ShowRoomInfo", sender: self)
}

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        // Get the new view controller using [segue destinationViewController].
        // Pass the selected object to the new view controller.
        if let roomInfoViewController = segue.destinationViewController as? RoomInfoViewController {
            if let identifier = segue.identifier{
                if identifier == "ShowRoomInfo"{
                    roomInfoViewController.roomUUID = self.roomUUID
                    println ("Show Room Info")
                }
            }
        }
    }

希望它有所帮助。 :)

答案 3 :(得分:0)

在prepare(for segue :)方法中,使用以下方法:

guard let indexPathOfSelectedRow = tableView.indexPathForSelectedRow else {
    fatalError("Unable to determine which cell is selected")
}

然后您可以像这样获得索引:

indexPathOfSelectedRow.row