2012-02-18 1 views
2

Я новичок в iOS dev, и я последовал за учебником, который был простым представлением UITableview и подробным представлением.UITableview и datasource как NSMutableArray

Это создает мой массив:

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

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

Хорошо! Итак, как мне создать объект с прикрепленными к нему массивами? Например, мне нужен список игроков в моем UITableview, тогда каждому игроку нужно, чтобы его высота, вес и средний уровень баллов передавались контроллеру подробного представления - возможно, изображение тоже. Как получить все эти вещи, связанные с UITableViewCell? –

+0

Думаю, я вижу, что вы хотите сделать сейчас. Я уточню свой ответ. – Darren

+0

Это выглядит хорошо. Можете ли вы помочь мне немного больше? Как пометить ячейки? Это не работает: 'cell.textLabel.text = [object objectForKey: @" person "];' Как мне получить доступ к строкам с контроллера подробного представления? Как я уже сказал, я новичок. Это огромная помощь! :) –

0

RIght теперь ваш объект 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] 

;

+0

Спасибо, Майкл! Это большая помощь. Не могли бы вы дать мне более подробно/пример? Я очень новый, и это лишь немного меня интересует. –

0

Для этого существует множество способов (лучше, чем ваш данный пример). Но я последую вашему примеру.

К вашим ключам присваивается объект NSString.

Что вы можете сделать, это создать класс Thing, который содержит все ваши атрибуты. и назначьте экземпляр этого класса вашим ключам. то есть.

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

Затем пройти myThingObject к вашему Detail View.

UPDATE:

Вещь класс содержит следующие свойства:

- 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

Как я уже сказал, я новичок в iOS и программировании в целом. Можете ли вы разбить это немного больше? Как добавить дополнительные объекты в ключ? (если это даже правильная терминология). –

+0

См. Обновление. –

 Смежные вопросы

  • Нет связанных вопросов^_^