2011-01-03 3 views
2

내가이난 그냥 예를 들어 배열에 하나 UILabel의를 추가하기 위하여려고하고있다

같은 것을 수행하여 newLabel.center을 변경하려면 나중에

NSMutablearray *labels = [[NSMutableArray alloc] init]; 
UILabel *newLabel = [[UILabel alloc] initWithFrame:CGRectMake(100,100,20,20)]; 
newLabel.center = CGPointMake(100, 100); 
[labels addObject:newLabel]; 

다음에있는 NSMutableArray에 저장 UILabels의 속성을 변경하는 방법

[labels objectAtIndex:1].center.x +=10; 

이 나에게 중심 오류 "구성원의 요청을"제공 "뭔가가 아닌 구조 또는 조합"
는 내가

[labels objectAtIndex:1]->center.x +=10; 
0 시도

다음이 나 다른 오류 제공했다 구조체 objc_object는 더 멤버 '센터'라는 이름 없다

내가 어떻게 저장소가있는 NSMutableArray에 UILabel의의 속성을 변경할 수 있습니까?

+1

nsarray는 0부터 시작하므로 첫 번째 객체의 인덱스는 1이 아니고 0이됩니다. – ughoavgfhw

답변

8

objectAtIndex:의 반환 유형이 단순히 id (모든 개체가 될 수 있음)이므로이 오류가 발생합니다. NSArray는 일반 컨테이너이므로 객체를 검색 할 때 어떤 유형인지 알 수 없습니다. 당신은을 알고 있습니다. 왜냐하면 그 안에 객체를 넣었으므로 컴파일러는 알지 못합니다.

당신이 쓴 :

기술적으로 정확하지만 컴파일러는 그것을 확인 입력 할 수 없습니다
[labels objectAtIndex:1].center.x +=10; 

. 그것은이를 작성하는 것과의 :

id object = [labels objectAtIndex:1]; 
object.center.x +=10; 

오류가 발생하는 경우 두 번째 줄은 다음과 같습니다 컴파일러는 object는 목표 - C 개체입니다 알고 있지만, 그것은 어떤 클래스를 모르는, 그래서 어떤 속성을 모르는 그래서 정의되지 않은 구조체 필드 멤버 액세스로 구문 분석하려고 시도합니다.

대신 작성하는 경우 :

UILabel *label = [labels objectAtIndex:1]; 
label.center.x +=10; 

이제 컴파일러는 속성 정의에 대해 알고, label이 UILabel의의 인스턴스 인 것을 알고, 그것은 올바른 코드를 생성 할 수 있습니다.

이제 구조 내에서 값을 변경하기 때문에 두 번째 문제점이 있습니다. 두 번째 줄 위입니다 속기에 대한 :

label.center.x = label.center.x + 10; 

이것은 목표 - C의 메소드 호출을 다시 속기 : 중심점이 CGPoint 구조체는

[label center].x = [label center].x + 10; 

때문에 /를 설정 얻을해야 전체 포인트 값을 한번에 x 또는 y 멤버를 업데이트 할 수는 없습니다. 다시 한번 이렇게해야합니다.

UILabel *label = [labels objectAtIndex:1]; 
CGPoint c = label.center; 
c.x += 10; 
label.center = c; 

원하는대로 할 수 있습니다.

Objective-C가 모든 임시 변수가 필요하기 때문에 Objective-C가 어리석은 말을하고 싶은 유혹을 느낀다면 한 가지 예에서 두 가지 특수한 경우에 부딪 힐 수 있습니다.

+0

또한 배열의 첫 번째 객체에는 인덱스가 0이므로'[objectAtIndex : labels labels ]'. – mohsenr

+0

이 문제가 해결되었습니다. 대단히 감사합니다. – Lingyong