2012-02-11 6 views
3

저는 xcode로 개발하는 것을 처음 접했고 다른 객체 안에있는 객체의 필드에 접근하는 방법을 궁금합니다 (예 : Vehicle Object 내의 Car 객체).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 파일의 Patient 클래스? – dasblinkenlight

+0

objective-C 오브젝트는 다른 오브젝트에 속한 필드에 직접 액세스 할 수 없습니다. (public C++ 멤버 에서처럼). 대신 다른 [otherObj getFoo] 또는 otherObj.foo 속성으로 메시지를 보내야합니다. – seand

답변

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

코드 자동 완성을 제외하고 점 구문이 작동해야합니다. –

+1

나는 그렇게 생각하지 않는다. 배열 객체가 불특정 유형을 가지고 있기 때문에 컴파일러는 "id 속성의 객체에서 찾을 수없는 foo 속성"과 같은 경고 메시지를 표시합니다. –

0

, 수업은 다음과 같이 보일 :

@interface Patient : NSObject { 
    NSString *name; 
} 

@property (nonatomic, copy) NSString *name; 

@end 


@interface Admission : NSObject { 
    Patient *patient; 
} 

@property (nonatomic, retain) Patient *patient; 

@end 

귀하는 Admission 개체의 배열 (admList)을 보유하고 있습니다. 또한

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

:

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

나 :

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

다음은 배열의 인덱스 i과 입학에 의해 참조있어 환자의 이름을 액세스 할 방법

+0

당신이 그 마지막 하나를 시도한다면 나는 그것이 작동하지 않는다는 것을 알게 될 것이라고 생각합니다. –

+0

@NickLockwood : 당신 말이 맞아요. 컴파일러는 그것을 처음에는 생각한 것처럼 오류가 아니라 경고로 취급합니다. –

+0

이것도 가능합니다 : [[admList objectAtIndex : i] patient] .name –

관련 문제