UITableview и источник данных как NSMutableArray - PullRequest
2 голосов
/ 18 февраля 2012

Я новичок в разработке для 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];
}

У меня есть рабочие ячейкии подробные виды.Как добавить больше объектов в мои ключи?Это возможно?Мне нужно, чтобы у каждого предмета [ключа] было много атрибутов (например, вещь, человек, место, цвет) ...

Можете ли вы разбить это на самые простые для меня термины?Спасибо!

Ответы [ 3 ]

3 голосов
/ 18 февраля 2012

Я не уверен, что понимаю ваш вопрос, но с каждым ключом может быть связан только один объект. В вашем случае вы используете объект 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. И вы можете захотеть иметь что-то вроде базы данных Core Data, в которой игроки хранятся и извлекаются (вместо того, чтобы жестко их кодировать или получать из plist-файла). Я надеюсь, что мой ответ поможет вам начать правильный путь.

0 голосов
/ 18 февраля 2012

Есть множество способов (лучше, чем ваш пример) сделать это.Но я последую вашему примеру.

Вы назначаете NSString Object своим ключам.

Что вы можете сделать, это создать класс 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

0 голосов
/ 18 февраля 2012

Теперь ваш datasource объект является NSArray.Вам нужно сделать его NSMutableArray.Объявите его как NSMutableArray в вашем заголовочном файле, и тогда вы можете сделать это:

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

Но, похоже, структура, которую вы на самом деле ищете, является NSMutableArray объектов NSDictionary.Вот так:

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

;

...