2012-03-14 2 views
0

Я хочу сохранить список записей данных в NSMutableArray для использования в UITableView. На других языках я бы использовал простую структуру типа для определения структуры записи, но я понимаю, как сделать это в Obj-C, чтобы определить новый класс. Я сделал это следующим образом:Objective C Добавление пользовательских объектов в NSMutableArray

@interface CustSuppListItem : NSObject 
@property (nonatomic, copy, readwrite) NSString *acCode; 
@property (nonatomic, copy, readwrite) NSString *acCompany; 
@property (nonatomic, copy, readwrite) NSString *acContact; 
@property (nonatomic, assign, readwrite) double osBalBase; 
@property (nonatomic, assign, readwrite) unsigned int acAccStatus; 
@end 

@implementation CustSuppListItem 
@synthesize acCode, acCompany, acContact, osBalBase, acAccStatus; 
@end 

В viewDidLoad моего UITableViewController я создаю экземпляр массива:

tableListDataArray = [[NSMutableArray alloc] init]; 

После того, как я извлекаться мои данные, я добавляю его в массив следующим образом:

CustSuppListItem *custSuppItem = [[CustSuppListItem alloc] init]; 
[custSuppItem setAcCode:[jsonCustSuppRecord getStringForKey:@"acCode"]]; 
[custSuppItem setAcCompany:[jsonCustSuppRecord getStringForKey:@"acCompany"]]; 
[custSuppItem setAcContact:[jsonCustSuppRecord getStringForKey:@"acContact"]]; 
[custSuppItem setOsBalBase:[jsonCustSuppRecord getDoubleForKey:@"osBalBase"]]; 
[custSuppItem setAcAccStatus:[jsonCustSuppRecord getIntForKey:@"acAccStatus"]];        
[tableListDataArray addObject:custSuppItem];       
[custSuppItem release]; 

В моем методе cellForRowAtIndexPath таблицы, я получить данные для текущей ячейки следующим образом:

CustSuppListItem *listDataRecord = [tableListDataArray objectAtIndex:indexPath.row]; 
[cell.lblCompanyName setText:listDataRecord.acCompany]; // EXC_BAD_ACCESS here 
[cell.lblAcCodeContact setText:[NSString stringWithFormat:@"%@, %@", 
           listDataRecord.acCode, listDataRecord.acContact]]; 
[cell.lblBalance setText:[Utils fmtNumber:listDataRecord.osBalBase withDecPlaces:2]]; 
[cell.lblStatus setText:[Utils exchAccStatusDesc:listDataRecord.acAccStatus]]; 
return cell; 

В методе dealloc для контроллера представления я выпустить NSMutableArray:

[tableListDataArray release]; 

Я новичок в Obj-C, поэтому было бы здорово, если бы кто-то мог бы подтвердить все, что я сделал до сих пор марок смысл и порядок. Я получаю прерывистую ошибку EXC_BAD_ACCESS при попытке прочитать свойство acCompany (см. Комментарий рядом с строкой), поэтому что-то не должно быть прав.

Любая помощь приветствуется,

Джонатан

+0

вы сохранить tableListDataArray в viewDidLoad? –

+0

Любые другие детали с консоли при ошибке EXC_BAD_ACCESS? В стороне, дизайн (инкапсуляция объекта CustSuppListItem как класс) является очень типичным дизайном ObjC. – FluffulousChimp

+0

@vpdn Почему «сохранить»? 'init' возвращает объект с' keepCount' +1 – FluffulousChimp

ответ

0

Все код выглядит разумно и правильно мне на первый взгляд.

Несколько вещей, которые я хотел бы посмотреть на это:

  1. Убедитесь, что клетка определенно имеет свойство lblCompanyName. Если вы пытаетесь присвоить свойство, которое не существует, вы получите этот тип ошибки. Вы задали тип пользовательского типа ячейки?

  2. Убедитесь, что всегда есть свойство acCompany, вызывающее EXC_BAD_ACCESS, а не только любое свойство объекта. Один из способов сделать это - изменить порядок строк в методе cellForRowAtIndexPath.

  3. Убедитесь, что listDataRecord, вызывающий сбой, правильно заполняется. Другими словами, убедитесь, что ваш jsonCustSuppRecord всегда действителен. Что возвращает jsonCustSuppRecord getStringForKey:, если ключ не существует в jsonCustSuppRecord?

  4. Установить точку останова на этой линии: [tableListDataArray addObject:custSuppItem]; и исследовать содержимое custSuppItem каждый раз (это расширение точки 3 выше)

+0

@ Джонатан - в чем была проблема/решение (чтобы другие могли учиться на этом)? –