2010-12-06 9 views
14

다음과 같은 코드가 작동 않는 이유 :있는 UIButton setTitle이라는 : ​​forState : 질문

[signInBtn setTitleColor:[UIColor blackColor] forState:UIControlStateHighlighted]; 
[signInBtn setTitleColor:[UIColor blackColor] forState:UIControlStateDisabled]; 

를이하지 않는 동안 :

[signInBtn setTitleColor:[UIColor blackColor] forState:UIControlStateHighlighted|UIControlStateDisabled]; 
+0

와우, 작동하지 않는 것이 이상하게 보입니다. +1 – BoltClock

+2

메소드 이름이 단 하나의'state :'not : states :'를 언급하는 것에 주목하십시오. – Jasarien

+5

@Jasarien 그들은 비트 마스크를 사용하지 말아야합니다. – bioffe

답변

29

나는이 질문이 오래된 것을 알고 있지만, 이러한 대답은 정확하지 않습니다.

각 별도로 당신은 비트 단위 때 state 속성이 UIControlStateHighlighted 또는 UIControlStateDisabled 있지만 두

해야 말을하거나 함께 당신이 그들이 둘다 state 속성에 설정해야합니다 진술하는 설정

. 의미 UIControlStateHighlightedUIControlStateDisabledstate 속성에 설정됩니다.

아래의 예제 코드는 내 요점을 완벽하게 보여줍니다. 동의하지 않으면 혼자 힘으로 달리십시오.

[button setTitle:@"highlighted and selected" forState:UIControlStateHighlighted | UIControlStateSelected]; 
[button setTitle:@"Highlighted only" forState:UIControlStateHighlighted]; 
[button setTitle:@"Selected only" forState:UIControlStateSelected]; 
[button setTitle:@"Normal" forState:UIControlStateNormal]; 

NSLog(@"Normal title: %@", [[button titleLabel] text]); // prints title: Normal 

[button setSelected:YES]; 

NSLog(@"Selected title: %@", [[button titleLabel] text]); // prints title: Selected only 

[button setSelected:NO]; 
[button setHighlighted:YES]; 

NSLog(@"highlighted title: %@", [[button titleLabel] text]); // prints title: Highlighted only 

[button setSelected:YES]; 

NSLog(@"highlighted and selected title: %@", [[button titleLabel] text]); // prints title: highlighted and selected 
+0

전혀 동의하지 않습니다. 각 비트가 상태를 나타내는 마스크가 있습니다. 별도로 설정하면 비트 OR을 사용합니다. 이를 검증하기 위해 항상 마스크 값을 검색 할 수 있습니다. 내 이해력을 넘어 한 번에 설정할 수없는 이유는 무엇입니까? – bioffe

+0

마스크 값을 검색하여 위의 두 호출에 대한 컨트롤 상태가 비트 단위로 OR 연산되었는지 어떻게 확인합니까? –

+4

@bioffer : 틀렸어. 패트릭 말이 맞아. 'setTitle : forState :'를 호출 할 때마다 버튼 안에 추가 제목을 설정하고 그것을 특정 마스크 조합에 할당합니다. 마스크 조합이 없으면 UIControlStateNormal 마스크의 제목 세트로 되돌아갑니다. 예를 들어 Patrick의 예제에서 첫 번째 줄에 주석을 달면 마지막 NSLog()는 강조 표시하고 선택한 제목 : normal "'을 인쇄합니다. 이것은 버튼이 강조 표시되고 선택되었을 때 제목을 설정하지 않았기 때문입니다. –

2

setTitleColor이 때문에 : forState가 : 방법은 알려진 UIControlState 당신을 받아 들일 수 두 개의 UIControlState 값을 함께 OR 연산합니다.

각 UIControlState는 (낮은 수준에서) 가장 단순한 정수 상수 일 수 있습니다.

업데이트 :

그것은 그것이 오히려 이상한 작동하지 않는 것을 만드는 비트 마스크는,하지만 내 포인트는 여전히 유효. (놀랍게도 한쪽으로 기울고 위험스럽게 흔들립니다.)

+1

['UIControlState'는 비트 마스크입니다.] (http://developer.apple.com/library/ios/documentation/uikit/reference/UIControl_Class/Reference/Reference.html#//apple_ref/c/tdef/UIControlState) – BoltClock

+0

http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIControl_Class/Reference/Reference.html%23//apple_ref/c/tdef/UIControlState – vikingosegundo

+0

불량합니다. 꽤 궁금해서 작동하지 않습니다. (그들은 아마도 알려진 비트를 비교하는 것만으로 비트가 설정되어 있는지 확인하지 않을 것입니다.) –

-1

버그 일 수 있습니다. UIControlStateHighlighted & UIControlStateDisabled과 같은 예기치 않은 값으로 비트 마스크를 변경해보십시오. 그러면 모든 상태 색상이 동일하게됩니다.

관련 문제