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

Ios 从NSArray中的自定义对象访问属性,ios,objective-c,encoding,nsarray,nsobject,Ios,Objective C,Encoding,Nsarray,Nsobject,我有一个自定义对象historyObject,它是我用一些属性创建的。其中一个是名为savedDate的NSString。我创建自定义对象,设置所有需要保存的值,并将其放置在数组historyArray中。在另一个VC中,我正在使用tableview,并希望使用自定义对象属性savedDate填充TableViews单元格textable 我可以注销historyArray,因此我知道对象在那里,我可以看到它们的名称,但我发现很难访问该对象的属性 这就是我试图用来设置稍后用于单元格标签文本的NS

我有一个自定义对象historyObject,它是我用一些属性创建的。其中一个是名为savedDate的NSString。我创建自定义对象,设置所有需要保存的值,并将其放置在数组historyArray中。在另一个VC中,我正在使用tableview,并希望使用自定义对象属性savedDate填充TableViews单元格textable

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

这就是我试图用来设置稍后用于单元格标签文本的NSString的内容:

NSString *cellLableText = [billDetails.historyArray objectAtIndex:indexPath.row] saveDate;
我觉得我看得太简单了,但看不出来

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

经过更多的跟踪和错误之后,我开始怀疑我是否正确地对对象进行了编码和解码。创建历史对象时,我对历史对象调用此方法

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>
    }
返回内容:obj:

当我试图访问这样一个属性时,它崩溃了 [[historyArray objectAtIndex:indexath.row]saveDate]

告诉我这个错误:

由于未捕获异常而终止应用程序 “NSInvalidArgumentException”,原因:“-[nsConcreteMatableData saveDate]:发送到实例0xb941460'的无法识别的选择器

我想我的问题是我是否正确地编码和解码了这个对象

编辑: 因此,经过多次尝试和错误后,我通过解码保存的对象,然后将该对象添加到一个新数组中,并使用该新数组填充我的表视图单元格,使其正常工作


谢谢你的帮助

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

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

saveDate是非原子的吗

如果弱属性和使用弧,则对象将返回nil

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

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

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

比在索引处访问对象所需的任何地方强制转换更好的方法是向类中添加一个方法,如

- (HistoryItem *)historyItemAtIndex:(NSUInteger)index {
    return self.billDetails.historyArray[index];
}
然后你可以这样做

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

当您尝试代码时会发生什么?你有错误吗?CellLabletText是零还是意外值?我发现它更容易理解为[billDetails.historyArray[indexPath.row]saveData];。如果我想注销该对象的内容,有什么好方法?循环?我想我记得Obj C有一些方便的方法来处理这类事情。@rmaddy问题是,不知道如何访问对象属性的人会暴露于点语法和文字,而他们可能还不知道。无论如何,每个人的编码风格是不同的。我不喜欢点语法和文字。@icekomo取决于你的意思。如果要注销historyObject的所有内容,需要重写-NSString*description函数,然后可以执行NSLog@%@,historyObject@icekomo如果您只是尝试注销每个对象,则可以在historyArray NSLog@%@,h中执行forHistoryObject*h;保存日期如下:@property非原子,强NSString*saveDate;是的,不,它并不弱。仅供参考:除非您准备好处理NSMutableString,否则通常最好是复制NSString属性而不是使其强
NSString *cellLabelText = [self historyItemAtIndex:indexPath.row].saveDate;