我怀疑我正在尝试做的事情的解决方案是相当直接的 - 然而,我无法让它自己工作。
这就是我要做的事情:我已经建立了一个卡片游戏,在游戏加载时用卡片进行初始化。现在,其中一些卡具有某些属性(卡类型,卡名称以及特殊阵列)。卡片类型和卡片名称对象相当容易检索,因为它们只是一个对象(我可以使用objectatindex调用)。但是,特殊数组包含几个关键字,这些关键字根据选择的卡而波动。因此,我不是逐个初始化这些关键字(就像我为卡片类型和卡片名称所做的那样),而是将它们放入自己的特殊数组..或数组中的数组。这是我的代码:
itemObjects类:
@synthesize cardName=_cardName;
@synthesize cardType=_cardType;
-(id) initWithCardName:(NSString*)cardName initWithCardType:(NSString*)cardType initWithSpecialArray:(NSArray*) specialArray{
self=[super init];
if (self){
_cardName=cardName;
_cardType=cardType;
}
return self;
}
模型类
-(NSMutableArray*)deck{
if (_deck==nil){
_deck=[[NSMutableArray alloc]initWithObjects:
[[itemObjects alloc]initWithCardName:@"The Long Way" initWithCardType:@"bill" initWithSpecialArray:[[NSArray alloc]initWithObjects:@"fast", @"high", nil]],
[[itemObjects alloc]initWithCardName:@"A Short Cut" initWithCardType:@"bill" initWithTrendArray:[[NSArray alloc]initWithObjects:@"small", @"tall", nil]],nil];
View Controller类(这是我试图调用其中一个对象的地方,例如“快”,但没有成功
NSString* testing=[[[self.model.deck objectAtIndex:indexPath.row]arrayForKey:@"specialArray"]objectAtIndex:0];
NSLog(@"%@",testing);
我相信我已经正确地初始化了我的“specialArray”,问题在于我是如何试图调用它的,但如果我在那里犯了错误,任何建议都会非常感激。谢谢!
编辑:感谢WendiKidd解决了这个特殊问题。事实证明我没有正确初始化我的specialArray。这导致了一个与here链接的单独问题。我还在下面为那些对未来感兴趣的人发布了我的更正代码:@synthesize cardName=_cardName;
@synthesize cardType=_cardType;
@synthesize specialArray=_specialArray;
-(id) initWithCardName:(NSString*)cardName initWithCardType:(NSString*)cardType initWithSpecialArray:(NSArray*) specialArray{
self=[super init];
if (self){
_cardName=cardName;
_cardType=cardType;
_specialArray=specialArray;
}
return self;
}
答案 0 :(得分:2)
您没有初始化您的特殊阵列 。您将其传递给initWithCardName
,但您从未将其设置为任何内容。您需要将特殊数组存储在该类中,就像使用cardName
和cardType
一样。
其次,我无法在你试图访问特殊数组的行上做出正面或反面。您没有向我们提供正确的信息,以查看对象的存储位置,以确定您是否正确访问了卡片对象,但我绝对看不到您曾使用过密钥@"specialArray"
的位置之前,所以没有理由期望会返回任何东西。然而,你的数据结构的其余部分可以工作,在某些时候你将拥有initWithCardName
函数初始化的任何类的对象(例如,我将继续并将其称为CardObject
)。要获取特殊数组中的信息,您必须将specialArray
对象保存到CardObject
类中,如前所述。然后你可以这样写:
CardObject* card = //[whatever you have to do to access the right card object]
for(NSString* specialAttribute in card.specialArray)
{
NSLog(@"Special Attribute: %@", specialAttribute);
}
这应该很好地打印出卡片的所有特殊属性。
如果你真的只想要列表中的第一项,正如你的例子试图访问的那样,这应该可以正常工作:
CardObject* card = //[whatever you have to do to access the right card object]
NSLog(@"Special Attribute: %@", [card.specialArray objectAtIndex:0]);