我在两周后在许多教程的帮助下尝试从TableView单元获取和segue数据。但似乎在XCode中无法做到这一点。只能获取一个单元格的selectedRow,但我无法读出所选单元格的文本标签。
如果用户选择了一个Cell,我想将所选单元格中的标签值转换为新的View Controller。
我只能将选定的行提交给新的View Controller,而不能提供此选定单元格中标签的值。
func tableView(tableView: UITableView, willSelectRowAtIndexPath indexPath: NSIndexPath) -> NSIndexPath? {
row = indexPath.row // here is the row the user has selcted
labelStringOfselectedCell = "??????" // how to retrieve data from a label in the cell?
return indexPath
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
let DestViewController : ViewControllerDetail = segue.destinationViewController as! ViewControllerDetail
DestViewController.seguedData = labelStringOfselectedCell
}
答案 0 :(得分:2)
如果你真的想做类似的事情,你可以这样做:
func tableView(tableView: UITableView, willSelectRowAtIndexPath indexPath: NSIndexPath) -> NSIndexPath? {
let cell = tableView.cellForRowAtIndexPath(indexPath) // do not confuse this with the similarly named `tableView:cellForRowAtIndexPath:` method that you've implemented
let string = cell?.textLabel?.text
return indexPath
}
显然,这取决于你是否是自定义细胞亚类以及标签是什么,但这说明了基本的想法。
话虽如此,你不应该这样做。你的应用应该遵循Model-View-Controller(MVC)编程范例。在确定要传递给下一个场景的数据时,您应该返回最初填充表时使用的原始模型,而不是指表中的某些控件。
例如,让我们假设您通过从objects
模型中检索数据来填充原始单元格:
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)
let object = objects[indexPath.row]
cell.textLabel?.text = object.name
return cell
}
然后你只需实现一个prepareForSegue
来检索objects
中的数据(你根本不必实现willSelectRowAtIndexPath
):
func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if let destination = segue.destinationViewController as? ViewControllerDetail {
let object = objects[tableView.indexPathForSelectedRow!.row]
destination.seguedData = object.name
}
}
显然,这将取决于您的模型是什么以及您最初如何填充单元格,但希望它说明了基本的想法。