我一直在尝试最长时间,从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>
代码永远不会到达(返回self.data.count),因为它总是在第三行展开可选项时返回Unexpected 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在控制台上打印出数据,但它不会让我在tableview上显示任何数据。此外,该方法只允许我查看包含其所有键的1个数组,而不是查看一个键的所有字典对象。
尝试以NSDictionary的形式查看文件的任何实例都会返回nil。任何以NSArray形式返回的实例都会给出无法在tableview上显示的结果,但可以使用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!")
}
这是在控制台上返回的内容
可选(&#34;(\ n {\ n dexNumber = 1; \ n formOrder = 1; \ n iconFilename = \&#34; pokemon-icon-1.png \&#34;; \ n名称= Bulbasaur; \ n yield = {\ n attack = 0; \ n defense = 0; \ n hp = 0; \ n spAttack = 1; \ n spDefense = 0; \ n speed = 0; \ n}; \ n },\ n {\ n dexNumber = 2; \ n
如何让我的视图在tableview上显示列表作为文本标签等,而不是什么都没有?
答案 0 :(得分:5)
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)
}
}
}