从带有indexPath.row的tableView中的Dictionary获取值?

时间:2016-03-08 22:55:06

标签: ios swift uitableview plist

我正试图从一个plist获取信息。这是结构:

Root
-Dictionary
--Dictionary
---String
---String
--Dictionary
---String
---String
--Dictionary
---String
---String

编辑:以及它的一些示例:

<plist version="1.0">
<dict>
    <key>introduction</key>
    <dict>
        <key>gfx</key>
        <dict>
            <key>titre</key>
            <string>Introduction</string>
            <key>color</key>
            <string></string>
            <key>miniLogo</key>
            <string></string>
            <key>bigLogo</key>
            <string></string>
        </dict>
...

所以基本上我要从嵌套在另一个字典中的字典中获取字符串值。

诀窍是,我想使用tableView

到目前为止,我在这里:

let pathRoot = NSBundle.mainBundle().pathForResource("MyPLIST", ofType: "plist")

let rootRubrique = NSDictionary(contentsOfFile: pathRoot!)

我正试图获得这样的信息:

let rubriqueTitre = NSDictionary(contentsOfFile: pathRoot!)?.allKeys[indexPath.row].objectForKey("gfx")?.valueForKey("titre")

但问题可能来自于我试图筛选

的方式
label.text = imageRubrique! as! String
// And also tried :
label.text = "\(imageRubrique!)"

此外,我试图获得其他价值,只是为了尝试。这对我有用:

let rubriqueIndex = NSDictionary(contentsOfFile: pathRoot!)?.allKeys[indexPath.row]
 label.text = rubriqueIndex as! String

我得到了一个小写的“介绍”,第一个。但我不想要那个价值,我想要嵌套的!我疯了!幸运的是Stackoverflow存在!

在那之后,我将不得不找到一种方法来按正确的顺序对字典进行排序,这似乎是另一个大问题......

编辑:我解决了第一个问题。我创建了这个功能:

func getValueFromPLIST(rub: String, sousDossier : String, sousSousDossier : String?, value : String) -> String {

if sousSousDossier == nil {

    return (NSDictionary(contentsOfFile: pathRoot!)!.objectForKey(rub)!.objectForKey(sousDossier)!.valueForKey(value) as? String)!
} else {

    return (NSDictionary(contentsOfFile: pathRoot!)!.objectForKey(rub)!.objectForKey(sousDossier)!.objectForKey((sousSousDossier!))!.valueForKey(value) as? String)!
}

}

然后我将索引分配给常量:

let rubriqueIndex = NSDictionary(contentsOfFile: pathRoot!)?.allKeys[indexPath.row]

然后我通过func:

生成整个valueForKey
let rubriquePathTitre = getValueFromPLIST(String(rubriqueIndex!), sousDossier: "gfx", sousSousDossier: nil, value: "titre")

我不知道为什么它正在使用这个技巧,但它正在工作,并且它并没有那么糟糕,因为我需要其他地方的索引。但不幸的是,我认为我将不得不使用其他东西,比如“排名”或“ID”值来排序我的字典。所以整个事情到底都没用了哈哈!

1 个答案:

答案 0 :(得分:2)

您可以使用UITableView索引代替迭代索引

// *** Access data from plist ***
let pathRoot = NSBundle.mainBundle().pathForResource("MyPLIST", ofType: "plist")

// *** Get Root element of plist ***
let rootRubrique = NSDictionary(contentsOfFile: pathRoot!)

// *** get Next element which is `Introduction` holding all other objects ***
let objIntro:NSDictionary = rootRubrique!.objectForKey("introduction") as! NSDictionary

选项1:使用索引

遍历所有对象
for var i = 1; i <= objIntro.allValues.count; ++i
{
    print("Index[\(i)] \(objIntro.allValues[0])")
}    

访问使用您的案例中的indexpath

let obj = (objIntro.allValues[indexPath.row])

选项2:遍历字典的所有值

for (key, value) in objIntro
{
    print("key: \"\(key as! String)\" obj : \(value)")
}