UITableview和数据源为NSMutableArray

时间:2012-02-18 17:37:22

标签: iphone ios ipad nsmutablearray nsmutabledictionary

我是iOS开发人员的新手,我遵循了一个简单的UITableview和详细视图的教程。

这会设置我的数组:

- (void)viewDidLoad
{
    [self setupArray];
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)setupArray
{
    states = [[NSMutableDictionary alloc]init];
    [states setObject:@"Thing 1" forKey:@"Subject 1"];
    [states setObject:@"Thing 2" forKey:@"Subject 2"];
    [states setObject:@"Thing 3" forKey:@"Subject 3"];
    [states setObject:@"Thing 4" forKey:@"Subject 4"];

    datasource = [states allKeys];
}

我有工作单元格和详细视图。如何在键上添加更多对象?那可能吗?我需要每个主题[key]都有很多属性(即一个东西,一个人,一个地方,一个颜色)......

你能否将这一点分解为最简单的条款?谢谢!

3 个答案:

答案 0 :(得分:3)

我不确定我是否理解你的问题,但每个密钥只能有一个与之关联的对象。在您的情况下,您正在使用NSString对象。如果您使用您创建的某个对象替换NSString,例如AnObjectWithAThingAndAPersonAndAPlace,则可以将多个属性与每个键关联。


我想我明白你现在想要的东西。你想要的不是一个与它相关联的数组的对象,而是一个对象数组。您可以使用NSDictionary对象执行此操作。

- (void)setupArray
{
    NSMutableArray *objectArray = [[NSMutableArray alloc] init];

    NSMutableDictionary *object1 = [[NSMutableDictionary alloc] init];
    [object1 setObject:@"Apple" forKey:@"thing"];
    [object1 setObject:@"Alex" forKey:@"person"];
    [object1 setObject:@"Alabama" forKey:@"place"];
    [object1 setObject:@"Azure" forKey:@"color"];
    [objectArray addObject:object1];

    NSMutableDictionary *object2 = [[NSMutableDictionary alloc] init];
    [object2 setObject:@"Banana" forKey:@"thing"];
    [object2 setObject:@"Bill" forKey:@"person"];
    [object2 setObject:@"Boston" forKey:@"place"];
    [object2 setObject:@"Blue" forKey:@"color"];
    [objectArray addObject:object2];

    datasource = [NSArray arrayWithArray:objectArray];
}

然后在你的UITableViewDataSource方法

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSInteger row = [indexPath row];        
    NSDictionary *object = [datasouce objectAtIndex:row];

    ...

}

您可以检索该对象的所有字符串。

如果我要做这样的事情,我可能会创建一个包含该数组的plist文件。然后你的setupArray方法可能如下所示:

- (void)setupArray
{
    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"YourFileName" ofType:@"plist"];
    NSDictionary *plistData = [NSDictionary dictionaryWithContentsOfFile:filePath]; 
    datasource = (NSArray*)[plistData objectForKey:@"ObjectsForTableView"];
}

我虽然会添加更多注释...如果不明显,你添加到字典中的对象不必是NSStrings,它们可以是任何对象,例如NSNumber,对于你的棒球运动员来说可能对你有用。此外,您可能希望创建自定义播放器对象而不是使用NSDictionary。而且你可能希望拥有类似于核心数据数据库的东西,其中存储和检索玩家(而不是硬编码或从plist文件中获取它们)。我希望我的回答可以让你开始走上正确的道路。

答案 1 :(得分:0)

现在您的datasource对象是NSArray。你需要使它成为一个NSMutableArray。在头文件中将其声明为NSMutableArray,然后您可以执行此操作:

datasource = [[states allKeys] mutableCopy];
[datasource addObject:whatever];

但是,听起来你实际上正在寻找的结构是NSDictionary对象的NSMutableArray。像这样:

NSDictionary *item = [NSDictionary dictionaryWithObjectsAndKeys:@"object1", @"key1", @"object2", @"key2", nil];
[datasource addObject:item]

答案 2 :(得分:0)

有很多方法(比你给出的例子更好)来做到这一点。但我会效仿你的榜样。

您正在为密钥分配 NSString对象

您可以做的是创建一个包含所有属性的 Thing 类。并将该类的实例分配给您的密钥。即

[states setObject:myThingObject forKey:@"Subject 4"];

然后将 myThingObject 传递给详细信息视图。

更新:

Thing 类包含以下属性:

  - person
  - place
  - color
  - thingName

所以,

[states setObject:@"Thing 1" forKey:@"Subject 1"];

变为

[states setObject:firstObject forKey:@"Subject 1"];
[states setObject:secondObject forKey:@"Subject 2"];

注意firstObject& secondObject是 Thing

的实例

要了解有关Objective-c中课程的更多信息,请访问:

  

https://developer.apple.com/library/ios/#referencelibrary/GettingStarted/Learning_Objective-C_A_Primer/_index.html