2012-02-11 83 views
3

我目前在xcode中开发新手,我想知道如何访问另一个对象内部的对象(即车对象内部的汽车对象)的字段。Objective-C:访问对象内的对象字段

对于我的cellForRowAtIndexPath方法,我试图访问位于我的Admission类中的Patient Class中的字段。我有一个数组[myList],它拥有准入对象,并且在准入对象中,我有病人对象。

这里就是我有一个问题的代码,我的cellForRowAtIndexPath方法中:

static NSString *CellIdentifier = @"SimpleCell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) 
    { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
    } 
    NSUInteger row = [indexPath row]; 
    cell.textLabel.text = [[admList objectAtIndex:row]admPatName]; 
    return cell; 
} 

问题是下面这行:

cell.textLabel.text = [[myList objectAtIndex:row]??]; 

在??区域,我无法弄清楚该领域的正确参考。

有什么建议吗?

感谢 JR

+0

您能否发布信息您的患者类从.h文件? – dasblinkenlight 2012-02-11 01:38:22

+0

Objective-C对象不能直接访问属于另一个对象的字段。 (如在公共C++成员中)。相反,您必须向另一个[otherObj getFoo]或另一个属性otherObj.foo发送消息。 – seand 2012-02-11 01:43:13

回答

1

像这样:

cell.textLabel.text = [[[myList objectAtIndex:row] patient] name]; 

或者,如果你愿意的话,像这样:

Admission *admission = [myList objectAtIndex:row]; 
cell.textLabel.text = admission.patient.name; 

我猜你有问题是点语法没有按不直接在[myList objectAtIndex:row]上工作,因为编译器不知道是什么类型的对象。您可以在Objective-C中互换使用点或句法,所以如果点语法不起作用,请尝试方括号。对于它的价值,你能得到它铸造数组对象用点语法的工作,但它是一个有点混乱,所有的括号:

cell.textLabel.text = ((Admission *)[myList objectAtIndex:row]).patient.name; 
+0

点代码语法应该工作,除了代码自动完成。 – 2012-02-11 01:44:03

+1

我不这么认为。每当我尝试过它,编译器就会抱怨类似于“在类型ID对象上找不到属性foo”的警告,因为数组对象具有未指定的类型。 – 2012-02-11 01:49:13

0

如果我理解正确的,你的类是这个样子:

@interface Patient : NSObject { 
    NSString *name; 
} 

@property (nonatomic, copy) NSString *name; 

@end 


@interface Admission : NSObject { 
    Patient *patient; 
} 

@property (nonatomic, retain) Patient *patient; 

@end 

,你有接纳对象的数组(admList)。这里是你将如何访问年代由录取数组中引用索引i病人的名字:

[[[admList objectAtIndex:i] patient] name] 

或者:

Admission *admission = [admList objectAtIndex:i]; 
cell.textLabel.text = admission.patient.name; 

或:

cell.textLabel.text = [admList objectAtIndex:i].patient.name; 

+0

如果你尝试最后一个,我认为你会发现它不起作用。 – 2012-02-11 01:52:05

+0

@NickLockwood:你是对的,它会让编译器把它看作是一个错误,而不是像我最初想的那样是一个警告。 – 2012-02-11 01:58:33

+0

这应该工作:[[admList objectAtIndex:i] patient] .name – 2012-02-11 02:06:06