从NSArray中的自定义对象访问属性

时间:2014-05-14 18:33:58

标签: ios objective-c encoding nsarray nsobject

我有一个自定义对象(historyObject),我创建了一些属性。其中一个是名为savedDate的NSString。我创建自定义对象集我需要的所有值保存它并将其放在一个数组(historyArray)中。从另一个VC我使用tableview并希望使用自定义对象属性savedDate填充表视图单元格textLable。

我可以NS注销historyArray,所以我知道对象在那里,我可以看到它们的名称,但是我发现很难访问该对象的属性。

这就是我试图设置一个NSString以便稍后用于lableText单元格的内容:

NSString *cellLableText = [billDetails.historyArray objectAtIndex:indexPath.row] saveDate;

我觉得我看起来很简单,但无法弄明白。

************* ** 更新 *********

经过一些更多的追踪和错误之后,我开始怀疑我是否正确编码解码对象。创建History对象时,我在历史对象

上调用此方法
NSData *hisotryEncodedObject = [NSKeyedArchiver archivedDataWithRootObject:historyObject];

历史对象符合NSCoding,所以我相信我有正确的。

然后,当我想在后一点使用对象中的数据时,我试图这样做: //抓住历史数组

historyArray = [[NSArray alloc] initWithArray:billDetails.historyArray];

然后我将这样的nsData取消归档:

  for (NSData *historyData in historyArray)
    {
        // set a instance of the person class to each NSData object found in the temp array
        GD_Owed_HistoryObject *historyObject = [[GD_Owed_HistoryObject alloc] init];
        historyObject = [NSKeyedUnarchiver unarchiveObjectWithData:historyData];
        NSLog(@"This is the history object %@", historyObject);
        // gives me back this: This is the history object <GD_Owed_HistoryObject: 0xb953400>
    }

但这个循环似乎只是让我回到内存位置?

  for (id obj in historyArray){
        NSLog(@"obj: %@", obj);
    }

它返回的内容:obj: <62706c69 73743030 d4010203 0405081d 1e542474 6f705824 6f626a65 63747358 24766572 73696f6e 59246172 63686976 6572d106 0754726f 6f748001 a6090a13 14151655 246e756c 6cd40b0c 0d0e0f10 11125c6f 77656453 61766544 6174655f 10116f77 6564416d 6f756e74 4368616e 6765645f 100f6f77 6564546f 74616c41 6d6f756e 74562463 6c617373 80028003 80048005 5a30352f 31392f32 30313456 2435302e 30305724 3135302e 3030d217 18191c58 24636c61 73736573 5a24636c 6173736e 616d65a2 1a1b5f10 1547445f 4f776564 5f486973 746f7279 4f626a65 6374584e 534f626a 6563745f 10154744 5f4f7765 645f4869 73746f72 794f626a 65637412 000186a0 5f100f4e 534b6579 65644172 63686976 65720008 00110016 001f0028 00320035 003a003c 00430049 0052005f 00730085 008c008e 00900092 0094009f 00a600ae 00b300bc 00c700ca 00e200eb 01030108 00000000 00000201 00000000 0000001f 00000000 00000000 00000000 0000011a>

当我尝试访问这样的属性时,它会崩溃 [[historyArray objectAtIndex:indexPath.row] saveDate];

给我这个错误:

  

由于未捕获的异常而终止应用   &#39; NSInvalidArgumentException&#39;,原因:&#39; - [NSConcreteMutableData   saveDate]:无法识别的选择器发送到实例0xb941460&#39;

我想我的问题是我是否正确编码和解码对象?

修改 所以经过一些更多的试验和错误后,我通过解码我保存的对象,然后将该对象添加到一个新数组并使用该新数组填充我的表视图单元格来实现它。

感谢您的帮助!

4 个答案:

答案 0 :(得分:1)

您需要用括号括起来访问historyObject的对象。

NSString *cellLabelText = [[[billDetails historyArray] objectAtIndex:[indexPath row]] saveDate];

答案 1 :(得分:0)

使用强制转换来查看对象的属性

((HistoryObject*)billDetails.historyArray[indexPath.row]).saveData 

答案 2 :(得分:0)

除了在索引处访问对象所需的任何地方之外,更好的方法是向类添加方法,如此...

- (HistoryItem *)historyItemAtIndex:(NSUInteger)index {
    return self.billDetails.historyArray[index];
}

然后你可以这样做......

NSString *cellLabelText = [self historyItemAtIndex:indexPath.row].saveDate;

答案 3 :(得分:-1)

saveDate(非原子,强)?

如果弱属性并且您使用ARC,则您的对象将返回nil;

NSString *text = [[[billDetails historyArray] objectAtIndex:[indexPath row]] saveDate];