我还是Swift的新手,所以请耐心等待。
目前,我已从JSON文件加载数据,然后将其显示在单个单元格上。
我有一个自定义单元格类,它有必要的标签出口(名称和编号)。
我想要做的是在给定行上从指定标签文本中检索数据,然后将其传递到另一个ViewController。
e.g。第3行有两个标签,“数据”和“2004”。我选择了第3行,并希望获得此单元格的“2004”值,并将其分配给一个变量,然后可以将其传递给另一个ViewController。 (“2004”将被视为我的自定义单元格类中的数字标签出口,即cell.number)
以下是一些可能有用的代码:
表视图控制器
import UIKit
class TableViewController: UITableViewController, UINavigationControllerDelegate {
@IBOutlet var segmentedSortOption: UISegmentedControl!
var array : NSArray = DataClass.dataStruct.jsonResult["data"] as NSArray
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var myCell:cell = self.tableView.dequeueReusableCellWithIdentifier("cell") as cell
var upperCasedNames = array[indexPath.row]["name"] as? String
if segmentedSortOption.selectedSegmentIndex == 0 {
myCell.No.text = array[indexPath.row]["no"] as? String
} else if segmentedSortOption.selectedSegmentIndex == 1 {
if let unsortedEvents = DataClass.dataStruct.jsonResult["data"] as NSArray {
let descriptor = NSSortDescriptor(key: "name", ascending: true, selector: "caseInsensitiveCompare:")
let aToZ = unsortedEvents.sortedArrayUsingDescriptors([descriptor])
myCell.No.text = aToZ[indexPath.row]["no"] as? String
}
}
return myCell
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "selectedItem" {
if let indexPath = self.tableView.indexPathForSelectedRow() {
let destinationController = segue.destinationViewController as ViewController
destinationController.eventData = indexPath.row as Int
}
}
自定义单元格类
import UIKit
class cell: UITableViewCell {
@IBOutlet var name: UILabel!
@IBOutlet var number: UILabel!
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
override func setSelected(selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
}
如果您还有其他问题,请询问。
如果您有更好的选择,请同时建议。
谢谢!
编辑:忘了提一个关键问题。有一个分段控件可以将JSON文件中给定顺序的数据重新组织为字母顺序。单元indexPath.row在A-Z视图的实例中变得无用,因为顺序完全不同。
答案 0 :(得分:2)
在prepareForSegue
中,您需要使用cellForRowAtIndexPath
(不是tableView(tableView: UITableView, cellForRowAtIndexPath
}并且将其传递给destinationController
来获取您被选中的单元格,请参阅以下示例:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "selectedItem" {
if let indexPath = self.tableView.indexPathForSelectedRow() {
// get the cell associated with the indexPath selected.
let cell = self.tableView.cellForRowAtIndexPath(indexPath) as cell!
// get the label text to pass to destinationController
var text1 = cell.name.text
var text2 = cell.number.text
let destinationController = segue.destinationViewController as ViewController
destinationController.eventData = indexPath.row as Int
}
}
}
我希望这对你有所帮助。
答案 1 :(得分:0)
1)您正在从JSON文件中将数据投入此tableview,对吧?因此,根据项目的结构,可能只需单击索引(行)并使用它从JSON获取关联数据。
let indexPath = tableView.indexPathForSelectedRow();
然后将整数indexPath传递给您用于获取关联数据的任何JSON解析库。
2)我不确定您的实施的自定义性质如何改变,但可能this more generic question有您的答案。
3)更多的hack-y解决方案,但是当您填充这个UITableView时,您可以将每个单元格的标记设置为其索引,然后您可以通过标记获取它并以此方式检索其标签值(如在this SO answer)?