addObject: в NSMutableArray и отправка в TableView - PullRequest
3 голосов
/ 12 января 2012

Xcode 4.2 iPhone Project

Я пытаюсь создать табличное представление, которое заполняется из NSMutableArray.В настоящее время, когда я запускаю симулятор, рассматриваемый tableView показывает 5 строк (это правильно), но все строки имеют одинаковую строку (это, очевидно, не правильно).Показанная строка взята из объекта LAST, определенного в моем NSMutableArray.Вот код:

- (void)viewDidLoad
{

[super viewDidLoad];

codes = [[NSMutableArray alloc] init];
TableList *listItem = [[TableList alloc] init];

[listItem setCodeTitle:@"Test Name 1"];
[listItem setCodeNumber:@"101"];
[listItem setCodeDescription:@"This is the description for 101."];
[codes addObject:listItem];

[listItem setCodeTitle:@"Test Name 2"];
[listItem setCodeNumber:@"102"];
[listItem setCodeDescription:@"This is the description for 102."];
[codes addObject:listItem];

[listItem setCodeTitle:@"Test Name 3"];
[listItem setCodeNumber:@"103"];
[listItem setCodeDescription:@"This is the description for 103."];
[codes addObject:listItem];

[listItem setCodeTitle:@"Test Name 4"];
[listItem setCodeNumber:@"104"];
[listItem setCodeDescription:@"This is the description for 104."];
[codes addObject:listItem];

[listItem setCodeTitle:@"Test Name 5"];
[listItem setCodeNumber:@"105"];
[listItem setCodeDescription:@"This is the description for 105."];
[codes addObject:listItem];

}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
//#warning Potentially incomplete method implementation.
// Return the number of sections.
return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
//#warning Incomplete method implementation.
// Return the number of rows in the section.
return [codes count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"CodeCell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}

// Configure the cell...
TableList *current = [codes objectAtIndex:indexPath.row];
cell.textLabel.text = [current codeTitle];

return cell;
}

Надеюсь, это болезненно очевидно для любого, кто имеет больше опыта, чем я ... У меня очень мало.

Ответы [ 2 ]

3 голосов
/ 12 января 2012

Вы сохраняете один и тот же объект 5 раз в своем массиве.Вы, похоже, ошибаетесь, что -addObject: скопирует объект, который ему передали, но это не так.Простое исправление состоит в том, чтобы изменить ваши -addObject: строки на

[codes addObject:[[listItem copy] autorelease]];

Это, конечно, при условии, что ваш класс TableList соответствует <NSCopying>.Если этого не произойдет, вы, вероятно, захотите это сделать.Если вы не хотите поддерживать копирование в этом классе, вам придется каждый раз создавать новый TableList объект.

Кроме того, если вы не используете ARC, вы пропускаете свой TableList object.


Для поддержки -copy вы должны соответствовать <NSCopying>, который является протоколом, который объявляет метод -copyWithZone: (хотя аргумент зоны - это историческое любопытство, которое должнобыть проигнорированным).Для этого измените строку @interface так, чтобы она выглядела как

@interface TableList : NSObject <NSCopying>

, а затем реализуйте метод -copyWithZone:

- (id)copyWithZone:(NSZone *)zone {
    // If our superclass conformed to <NSCopying> we'd call [super copy]
    // But it doesn't, so alloc/init a new instance
    TableList *newObj = [[TableList alloc] init];
    newObj.codeTitle = self.codeTitle;
    newObj.codeNumber = self.codeNumber;
    newObj.codeDescription = self.codeDescription;
    return newObj;
}

Это всего лишь пример реализации.Предполагается, что эти 3 свойства являются единственными значениями объекта, и что уместно просто присвоить этому свойству.Если у вас есть внутренние ivars, которые нужно скопировать, вы можете получить доступ к ivar, используя что-то вроде

newObj->ivar = copyIvar(self->ivar); // self->ivar is the same as just plain ivar
0 голосов
/ 16 октября 2012

Также, если вы используете NSMutableArray, попробуйте связать его с NSArray.

...