根据选择的初始值显示 JSON 数据

Posted

技术标签:

【中文标题】根据选择的初始值显示 JSON 数据【英文标题】:Display JSON data based on initial value selected 【发布时间】:2016-02-02 00:45:42 【问题描述】:

我有一个包含术语、描述和 ID 的 JSON 文件(当前是本地文件,但会及时成为 URL)。我想要实现的是在我的初始视图中列出所有术语,然后根据选择的内容,显示一个新视图(通过 segue),其中包含术语+它的相关描述显示。

在我的初始视图控制器中,我有一个 TableView 当前显示来自 JSON 的术语列表。我已设法将所选术语传递到新视图,但我在显示相关描述时遇到了困难。我正在使用 SwiftyJSON,我的解析器看起来像:

func parseJSON()
    let path : String = NSBundle.mainBundle().pathForResource("scrumTerms", ofType: "json") as String!
    let jsonData = NSData(contentsOfFile: path) as NSData!
    let readableJSON = JSON(data: jsonData, options: NSJSONReadingOptions.MutableContainers, error: nil)

    NumberofRows = readableJSON["Terms"].count

    for i in 1...NumberofRows
        var item = "item"
        item += "\(i)"
        let term = readableJSON["Terms"][item]["term"].string as String!
        let description = readableJSON["Terms"][item]["description"].string as String!
        let id = readableJSON["Terms"][item]["id"].int as Int!


        TermsArray.append(term)
        DescriptionArray.append(description)
        //IdArray.append(id)
    

显示初始列表如下所示:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell!

    if TermsArray.count != 0
        cell.textLabel?.text = TermsArray[indexPath.row]

    

    return cell

然后我的 segue 部分看起来像:

func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!) 

    // Get Cell Label
    let indexPath = tableView.indexPathForSelectedRow!
    let currentCell = tableView.cellForRowAtIndexPath(indexPath)! as UITableViewCell

    viewTerm = currentCell.textLabel!.text

    performSegueWithIdentifier("viewTerm", sender: self)




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

    if (segue.identifier == "viewTerm") 

        // define new view controller
        var viewController = segue.destinationViewController as! viewTermController
        // define the new view controller property that will store the passed value(s)
        viewController.viewTerm = viewTerm
        viewController.viewDescription = "THIS IS WHERE I NEED TO GET TO"
    


任何建议将不胜感激!

【问题讨论】:

与其构建两个数组,不如制作一个以术语为键、描述为值的字典?然后你可以像现在一样设置术语(viewController.viewTerm = viewTerm),描述为viewController.viewDescription = termDict[viewTerm] @MichaelKohl - 非常感谢!我重新编写了整个部分以创建字典并使用“键、值”参数。我是(快速)开发的新手,所以需要一段时间才能实现,但效果很好!非常感谢您为我指明了正确的方向。 很高兴我能帮上忙 :) 【参考方案1】:

根据 Michael 的初始评论使用替代方法(字典)以及使用 SwitfyJSON 成功实施。谢谢。

我最终将我的 JSON 声明为:

 let path: String = NSBundle.mainBundle().pathForResource("MY FILE NAME", ofType: "json") as String!
    let data = NSData(contentsOfFile: path) as NSData!

    let json = JSON(data: data)

    parseJSON(json)

然后解析函数看起来像:

func parseJSON(json: JSON) 
    for result in json["results"].arrayValue 
        let title = result["keyTerm"].stringValue
        let desc = result["description"].stringValue
        let termId = result["termId"].stringValue
        let obj = ["keyTerm": title, "description": desc, "termId": termId]

        objects.append(obj)   
    
    tableView.reloadData()

然后我的 segue 将所选行的值传递给第二个视图控制器:

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

    if segue.identifier == "showDetail" 
        if let indexPath = self.tableView.indexPathForSelectedRow 
            let object = objects[indexPath.row]
            let controller = segue.destinationViewController as! DetailViewController
            controller.detailItem = object   
        
    

【讨论】:

以上是关于根据选择的初始值显示 JSON 数据的主要内容,如果未能解决你的问题,请参考以下文章

Swift 根据响应类型为 JSON 字段值动态选择 Codable 结构

根据在选择/下拉框中而不是复选框中选择的值动态获取和显示地图图层

LigerUI 表单和表格中的combobox如何初始化值

根据选择值显示隐藏多个 div

MySQL,根据 JSON 数组中的值选择记录

C# CaliburnMicro:如何根据在数据网格中选择的项目自动在组合框中显示值?