提问者:小点点

显示从 Plist 到 Tableview 的字典数组,Swift (Array<Dictionary<String,AnyObject>>)


我一直在尝试将字典数组从 plist 显示到 TableView 中。这是 .plist 文件的一个片段。

<array>
<dict>
    <key>dexNumber</key>
    <integer>1</integer>
    <key>formOrder</key>
    <integer>1</integer>
    <key>iconFilename</key>
    <string>pokemon-icon-1.png</string>
    <key>name</key>
    <string>Bulbasaur</string>
    <key>yield</key>
    <dict>
        <key>attack</key>
        <integer>0</integer>
        <key>defense</key>
        <integer>0</integer>
        <key>hp</key>
        <integer>0</integer>
        <key>spAttack</key>
        <integer>1</integer>
        <key>spDefense</key>
        <integer>0</integer>
        <key>speed</key>
        <integer>0</integer>
    </dict>
</dict>
<dict>
    <key>dexNumber</key>

代码永远不会返回(return self.data.count),因为在第三行展开可选时,它总是返回意外的nil。

if let path = NSBundle.mainBundle().pathForResource("dex", ofType: "plist"){
        if let dict = NSDictionary(contentsOfFile: path){
                data = dict.objectForKey("name") as! [String]
            }
    }

将 (let dict = NSDictionary) 更改为 (let dict = NSArray) 让我使用 println 在控制台上打印出数据,但它不允许我在表视图上显示任何数据。此外,该方法仅允许我查看 1 个数组及其所有键,而不是查看一个键的所有字典对象。

任何试图将文件视为NSDictionary的实例都会返回nil。作为NSArray返回的任何实例都会给出一个结果,该结果不能显示在表视图上,但可以使用println显示在控制台上。此代码段是打印结果的代码示例。

let resultDictionary = NSArray(contentsOfFile: path)
    println("Loaded dex.plist file is --> \(resultDictionary?.description)")
    var myDict = NSArray(contentsOfFile: path)
    if let dict = myDict {
        //loading values
        Item0ID = dict.objectAtIndex(0)
        print(Item0ID)
    } else {
        println("WARNING: Couldn't create dictionary from dex.plist! Default values will be used!")
    }

这是在控制台上返回的

可选的("(\n{\n dexDigital=1;\n formord1=1;\n confilename=\"pokemon-icon-1.png\";\n name=Bulbasaur;\n产量={\n攻击=0;\n防御=0;\n hp=0;\n spattack=1;\n sp防御=0;\n速度=0;\n};\n},\n{\n dexNum=2;\n

我如何让我的视图在tableview上显示一个文本标签之类的列表,而不是什么都不显示?


共1个答案

匿名用户

plist包含一个字典数组,而不是字典本身,所以您需要将其初始化为一个NSArray,然后迭代您想要打印的元素,并使用它们来构建您的数据数组。试试这个:

var data = [String]()
if let path = NSBundle.mainBundle().pathForResource("dex", ofType: "plist"){
    if let arrayOfDictionaries = NSArray(contentsOfFile: path){
        for dict in arrayOfDictionaries {
            data.append(dict.objectForKey("name") as! String)
        }
    }
}