来自 plist 的 UITableView 加载到字典的 NSArray
Posted
技术标签:
【中文标题】来自 plist 的 UITableView 加载到字典的 NSArray【英文标题】:UITableView from plist loaded into NSArray of Dictionaries 【发布时间】:2014-02-06 02:15:35 【问题描述】:我一直在阅读有关此主题的大量操作方法,但我无法弄清楚。
如果我有这样的 plist:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
<dict>
<key>color</key>
<string>brown</string>
<key>height</key>
<real>40</real>
<key>length</key>
<real>75</real>
<key>level</key>
<real>2</real>
<key>name</key>
<string>bear</string>
<key>note</key>
<string>ugly, but strong</string>
<key>width</key>
<real>30</real>
</dict>
<dict>
<key>color</key>
<string>tan</string>
<key>height</key>
<real>20</real>
<key>length</key>
<real>30</real>
<key>level</key>
<real>4</real>
<key>name</key>
<string>dog</string>
<key>note</key>
<string>cute</string>
<key>width</key>
<real>8</real>
</dict>
<dict>
<key>color</key>
<string>chestnut</string>
<key>height</key>
<real>75</real>
<key>length</key>
<real>90</real>
<key>level</key>
<real>3</real>
<key>name</key>
<string>horse</string>
<key>note</key>
<string>fast</string>
<key>width</key>
<real>22</real>
</dict>
<dict>
<key>color</key>
<string>gray</string>
<key>height</key>
<real>20</real>
<key>length</key>
<real>85</real>
<key>level</key>
<real>2</real>
<key>name</key>
<string>shark</string>
<key>note</key>
<string>hungry!</string>
<key>width</key>
<real>35</real>
</dict>
</array>
</plist>
我可以像这样加载数据并打印整个列表:
NSString *path = [[NSBundle mainBundle]pathForResource:@"testdata" ofType:@"plist"];
NSMutableArray *foodsList = [[NSMutableArray alloc] initWithContentsOfFile:path];
NSLog(@"Did Load - FoodsList = %@", foodsList);
但是当我将它加载到 UITableView 中以便获得名称列表时,我无法让它工作。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
cell.textLabel.text = [[testdata objectAtIndex:indexPath.row]objectForKey:@"name"];
return cell;
NSMutableArray *keyValues = testdata[key];在 Dictionary 和 Array 类型之间切换行失败。
我做错了什么?
谢谢,
丹
【问题讨论】:
感谢大家的回复。我发现我在 numberOfRowsInSection 中有一个错误......显然它正在阻止所有内容被执行。我将在下面的答案中详细说明。 【参考方案1】:您没有在cellForRowAtIndexPath
内的任何地方设置文本:
设置单元格标签文本
cell.textLabel.text = @"Hello World";
【讨论】:
修复了您输入的错误,我在 UITableViewCell 部分中放置了一个 NSLog 语句,但我什至没有看到程序到达那里......现在调查原因。【参考方案2】:问题在于您如何在 plist 中构建数据,或者您尝试读取其内容的方式。
首先,定义 4 个字典数组,其中包含 7 个键(颜色、高度、长度、级别、名称、注释、宽度)和各自的值。
因此,对于每一行(总共 4 行),您可以通过获取属性字典来访问它的键/值:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
...
NSDictionary* rowProperties = [testdata objectAtIndex:indexPath.row];
NSString* color = [rowProperties objectForKey:@"color"];
NSNumber* height = [rowProperties objectForKey:@"height"];
...
如果您需要以其他方式访问数据,也许您可以更改 de plist 数据以适应这种方式。
【讨论】:
【参考方案3】:试试这个,它将根据表格视图中的行号加载适当的单元格。该行号将用作保存您的字典的数组中的索引。
- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"Cell"];
NSMutableDictionary *rowProperties = self.keyValues[indexPath.row]; // keyValues is an array holding your dictionaries from the plist
NSString *color = rowProperties[@"color"];
cell.textLabel.text = color;
// continue the same process for all of your items in your dictionary
return cell;
【讨论】:
【参考方案4】:试试这个:
- (NSArray *)plist
if (plist == nil)
// Get the URL of the property list
NSURL *url = [[NSBundle mainBundle] URLForResource:@"PropertyList" withExtension:@"plist"];
// Load the contents of the property list in to a NSData object
NSData *plistData = [NSData dataWithContentsOfURL:url];
NSPropertyListFormat propertyListFormat;
NSError *error;
// Create an immutable property list from the data
_plist = (NSArray *)[NSPropertyListSerialization propertyListWithData:plistData options:NSPropertyListImmutable format:&propertyListFormat error:&error];
// Check for error
if (error)
#ifdef DEBUG
NSLog(@"[Property List] %@", [error description]);
#endif
// Return nil if there is one
return nil;
return plist;
- (id)propertyListKeyAtIndex:(NSInteger)aKeyIndex inDictionaryAtIndex:(NSInteger)aDictionaryIndex
// Load the dictionary
NSDictionary * __weak dictionary = (NSDictionary *)self.plist[aDictionaryIndex];
// Load all of the keys
NSArray * __weak keyArray = [dictionary allKeys];
// Return with the key
id key = keyArray[aKeyIndex];
return key;
- (id)valueForPropertyListKey:(NSString *)aKey inDictionaryAtIndex:(NSInteger)aDictionaryIndex
// Load the dictionary
NSDictionary * __weak dictionary = (NSDictionary *)self.plist[aDictionaryIndex];
// Get the value of the key from the dictionary
id object = dictionary[aKey];
// Return with the value
return object;
或
NSString * __weak key = (NSString *)[(NSDictionary *)self.plist[0] allKeys][0];
id value = self.plist[0][key];
【讨论】:
【参考方案5】:它在每个函数中加入了 NSLog 语句,我只看到了七个响应中的两个,所以这让我开始追踪为什么 UITableViewCell 没有被调用。
在行数的初始化中,我为指向 Nil 值的数组设置了错误的 var 名称,因此实际上我是说行数为零,因此无需继续进行。
在下面的示例中,“testdata”已被替换为具有 NIL 值的“namedata”。
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
NSInteger *Count = [@(testdata.count) integerValue];
return Count;
在我再次打扰你们之前,我必须更加小心地检查我的工作。
我感谢你们每个人的帮助...我将研究为什么您会以您的方式做出回应...总是要学习更多...
丹
【讨论】:
以上是关于来自 plist 的 UITableView 加载到字典的 NSArray的主要内容,如果未能解决你的问题,请参考以下文章