从PList获取数据到UITableView?

时间:2011-12-26 13:41:33

标签: objective-c uitableview nsarray plist nsdictionary

我想维护一个记录列表,每个记录都保持相同类型的数据。我想在两个不同的地方使用这些数据:

  1. UITableView从每条记录中获取“名称”值
  2. UIViewController,它将所有数据用于不同的字段。
  3. 我假设我应该使用plist来存储数据;我还假设应该接收UITableView数据的对象是NSArray,因此我可以使用cellForRowAtIndexPath方法自动创建表。

    所以我创建了plist“PLForArr.plist”: enter image description here

    似乎我只能在使用

    调用plist时获得NSDictionary
    NSString *path = [[NSBundle mainBundle] pathForResource:@"PLForArr" ofType:@"plist"];
    NSArray * myArr = [[NSArray alloc] initWithContentsOfFile:path]; //doesn't work...
    NSDictionary * myDict = [[NSDictionary alloc] initWithContentsOfFile:path]; //does work, but who to I make a NSArray out of it / or get the data from here to the UITableView?
    

    我明白我不明白基本的东西......有人可以一步一步地带我:

    1. 如何保存数据 - 我应该使用plist还是别的?我应该有一个类型数组的主记录(就像我在这里的示例plist上所做的那样)或者我可以将它保留为这些字典而没有考虑MyArr结束目标时使用的不必要的UITableView吗?
    2. 如何调用数据 - 有没有办法让它进入NSArray或必须进入NSDictionary
    3. 如何将其调入UITableView - 我可以使用NSDictionary填写行吗?

2 个答案:

答案 0 :(得分:2)

  1. 将数据存储在字典或数组中取决于您自己。根据您拥有的数据类型,您将考虑存储无序的对象集合(字典),使用键访问条目;或者更确切地说,在有序集合(数组)中,使用数字索引

  2. 从属性列表文件中获取数组很好,但是根(顶级)对象是一个字典(在屏幕截图中,“MyArr”不是顶级对象,它是访问的关键你的数组在顶级字典中)。要从中获取数组,只需按照您的方式分配/初始化plist字典,然后使用其键([myDict objectForKey:@"MyArr"])访问数组条目。否则,请确保将属性列表的根对象设置为数组,然后重试NSArray的{​​{1}}

  3. 真正的问题似乎是如何我可以用我的数据填充单元格?表视图询问其委托和dataSource,以显示要显示的部分中的行数。根据这些数字,它会向dataSource询问单元格。再一次取决于您选择的存储类型,您将以稍微不同的方式实现这些方法,但概念仍然存在。

  4. 您可能希望阅读有关以下内容的文档:

答案 1 :(得分:2)

  1. 存储数据是数组或字典取决于您。但是如果你想随着时间的推移对其进行更改,则无法将其存储在主包中。

  2. 您的pList文件是包含数组的字典。请参阅下面的代码示例。

  3. 您必须将字典存储在数组中,以用于表的数据源。请参阅下面的代码示例。

  4. 假设您的UITableView的数据源名为tableArray。您可以使用tableArray填写表格和视图中的信息。哦是的,

    NSString *path = [[NSBundle mainBundle] pathForResource:@"PLForArr" ofType:@"plist"];
    NSDictionary *myDict = [[NSDictionary alloc] initWithContentsOfFile:path];
    
    NSArray *myArray = [myDict objectForKey:@"MyArray"];
    self.tableArray = [myArray copy];
    [myArray release];
    [myDict release];
    

    这在tableView:cellForRowAtIndexPath:

    cell.text = [[tableArray objectAtIndex:row]objectForKey:@"Obj Name"];