从plist加载到字典的NSArray中的UITableView

时间:2014-02-06 02:15:35

标签: ios uitableview nsarray nsdictionary plist

我一直在阅读关于这个话题的一堆内容,但我无法弄明白。

如果我有这样的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]; line在Dictionary和Array类型之间失败。

我做错了什么?

谢谢,

5 个答案:

答案 0 :(得分:1)

您没有在cellForRowAtIndexPath内的任何位置设置文字:

设置单元格标签文本

cell.textLabel.text = @"Hello World";

答案 1 :(得分:1)

问题在于如何构建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数据以适应这种方式。

答案 2 :(得分:1)

试试这个:

- (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;
}

OR

NSString * __weak key = (NSString *)[(NSDictionary *)self.plist[0] allKeys][0];
id value = self.plist[0][key];

答案 3 :(得分:1)

尝试此操作,它将根据表视图中的行号加载相应的单元格。该行号将用作包含词典的数组中的索引。

- (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 :(得分:0)

它在每个函数中放入了NSLog语句,我只看到了七个中的两个响应,所以这让我开始追踪为什么没有调用UITableViewCell。

在行数的初始化中,我有一个指向Nil值的数组错误的var名称,所以实际上我说的是零行,所以没有必要继续进行。

在下面的示例中,“testdata”已替换为“namedata”,其具有NIL值。

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    NSInteger *Count = [@(testdata.count) integerValue];

    return Count;

}

在我再次打扰你之前,我必须更加小心地检查我的工作。

我感谢你们每个人的帮助......我将研究你们为什么以你们的方式做出回应......总是要学习......