我试图创建我的第一个segue,并且我想将我选择的tableViewCell中的数据传递给我所选择的辅助视图控制器。
我的问题是:
由于prepareForSegue没有使用indexPath,如何获取有关我选择的特定单元格的信息?
这里是我的应用程序的照片,里面有一些虚拟数据,带右箭头的单元格代表我想要的细胞:
这是我的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
}
*如果您需要在下面的评论中看到更多代码,请告诉我
答案 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