我想在NSMutableArray中存储数据记录列表,以便在UITableView中使用。在其他语言中,我会使用一个简单的“类型”结构来定义记录结构,但我知道在Obj-C中执行此操作的方法是定义一个新类。我这样做了如下:
@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
在我的UITableViewController的viewDidLoad中,我实例化了数组:
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很新,所以如果有人能够确认到目前为止我所做的一切都是有道理的,那就太棒了。我在尝试读取acCompany属性时遇到间歇性的EXC_BAD_ACCESS错误(请参阅行旁边的注释),所以一定不能正确。
任何帮助表示赞赏,
乔纳森
答案 0 :(得分:0)
乍一看,您的所有代码看起来都合理且正确。
我要看的一些事情是:
确认该单元格肯定具有属性lblCompanyName
。如果您尝试分配给不存在的属性,那么您将收到此类错误。您是否定义了自定义单元格对象类型?
确认它始终是导致acCompany
的{{1}}属性,而不仅仅是对象上的任何属性。一种方法是更改EXC_BAD_ACCESS
方法中行的顺序。
确认首先正确填充导致崩溃的listDataRecord。换句话说,请确认您的cellForRowAtIndexPath
始终有效。如果jsonCustSuppRecord
中不存在密钥,jsonCustSuppRecord getStringForKey:
会返回什么?
在此行设置断点:jsonCustSuppRecord
并每次检查[tableListDataArray addObject:custSuppItem];
的内容(这是上面第3点的扩展)