来自 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的主要内容,如果未能解决你的问题,请参考以下文章

如何将图像从 plist 加载到 UITableView?

如何将plist中的字符串加载到uitableview中

使用 plist 加载 UITableView 的内容

将 plist 数据加载到 UITableView 时从不调用惰性初始化程序

在搜索期间重新加载 UITableView

如何将数据从基于 plist 的 UITableView 传递到 UIViewController