프로그래밍 방식으로 UIButton 제목 / 텍스트를 업데이트 할 수 있습니까?


96

UIButton누르면 사용자가 일부 설정을 변경할 수있는 새보기가 표시됩니다. 보기가 닫히면의 제목 / 텍스트를 업데이트 UIButton하여 새 상태를 반영 하고 싶습니다 . 전화 :

[myButton setTitle: @"myTitle" forState: UIControlStateNormal];
[myButton setTitle: @"myTitle" forState: UIControlStateApplication];
[myButton setTitle: @"myTitle" forState: UIControlStateHighlighted];
[myButton setTitle: @"myTitle" forState: UIControlStateReserved];
[myButton setTitle: @"myTitle" forState: UIControlStateSelected];
[myButton setTitle: @"myTitle" forState: UIControlStateDisabled];

그러나 IB에 지정된대로 원본 텍스트 / 제목에서 변경되지 않는 것 같습니다.


2
게시 된 코드가 호출되고 있습니까? 이를 증명하기 위해 BREAKPOINT를 배치 했습니까? 대리인의 서명을 게시 할 수 있습니까?
Pablo Santa Cruz

3
제쳐두고, 여러 컨트롤 상태를 한 번에 참조 할 수 있다고 생각합니다. [myButton setTitle : @ "myTitle"forState :( UIControlStateNormal | UIControlStateApplication | UIControlStateHighlighted | ...)]; 논리 OR 연산자 (||)와는 반대로 비트 OR 연산자를 사용합니다. 일반적으로 이와 같은 상태를 처리 할 때 | 운영자. 내가 심하게 착각하면 누군가 나를 바로 잡습니다. :)
CIFilter

D : 나는 그들이 UIControlStateAll 같은 일이 있었으면 좋겠다
테이 버를

2
비트 조합이 iOS5에서 작동하지 않는 것 같습니다.
Echilon 2012

여기에도 같은 문제가 있습니다. 비트 조합은 iOS5에서 작동하지 않습니다. / CC @LucasTizma
znq

답변:


52

뷰 컨트롤러 클래스에 IBOutlet으로 지정된 버튼이 있고 Interface Builder의 콘센트로 올바르게 연결되어 있습니까 (새 참조 콘센트에서 파일 소유자로 Ctrl 드래그하고 UIButton 개체 선택)? 이것이 일반적으로 이러한 증상을 볼 때 발생하는 문제입니다.


편집 : 여기에서는 그렇지 않지만 속성 제목 을 버튼에 설정 한 다음 속성 제목이 아닌 제목을 변경하려고 하면 이와 같은 일이 발생할 수도 있습니다 .


4
빙고, 그게 다야, 고마워. Objective-C가 이와 같은 경우에 nil 개체에 메시지를 보내는 것이 괜찮은 척하는 대신 NullPointerException을 던지기를 바랍니다. 이것은 거의 매일 나를 물고 ... 으!
George Armhold

20
이 때문에 ObjC는 전무에게 메시지를 보내하기 위해 OK를 '척'하지 않는 것입니다 전무에게 메시지를 보낼 OK ...
Jasarien

1
여기서 문제는 nil 포인터가 아닙니다. 문제는 IB가 IBOutlet을 통해 코드에서 제대로 참조되지 않는 UIButton 인스턴스를 설정했기 때문에 프로그래밍 방식으로 조작 할 수 없다는 것입니다.
CIFilter 2009-06-25

112

UIControlStateNormal의 제목 매개 변수를 설정하기 만하면 문제가 해결되었으며 다른 상태에서 자동으로 작동합니다. 다른 UIControlState를 설정할 때 문제가 발생한 것 같습니다.

[myButton setTitle: @"myTitle" forState: UIControlStateNormal];


13

또 다른 문제를 발견했습니다. iOS 5에 도입 된 버그 일 수 있지만,이 문제를 접하는 다른 사람에게 지적 할 것이라고 생각했습니다.

XIB에서 버튼에 대한 기본 텍스트를 설정하지 않으면 프로그래밍 방식으로 설정하면 텍스트가 표시되지 않습니다. XIB에서 텍스트를 설정하면 나중에 프로그래밍 방식으로 버튼에 할당하는 모든 텍스트가 기본 텍스트의 크기로 잘립니다.

마지막으로, 버튼과 함께 뷰를 표시 한 다음 다른 뷰 (예 : ActionSheet)를 호출 한 다음 닫으면 프로그래밍 방식으로 버튼에 할당 한 텍스트가 지워지고 버튼 캡션이 설정 한 값으로 돌아갑니다. XIB에서.


1
나는이 세 가지 행동을 모두 알아 차렸고 확실히 성가시다.
Flea

2
잘림 문제가 있었기 때문에 (텍스트를 프로그래밍 방식으로 더 긴 것으로 변경) 텍스트 끝에 추가 공백을 넣어 텍스트를 더 긴 단어로 변경할 때 해당 공간을 '예약'했습니다. 그것은 나를 위해 일했습니다.
mattorb 2011

2
이에 대한 수정은 [_button setTitle : @ "title"forState : UIControlStateNormal] 메서드를 사용하는 것 같습니다. _button.titleLabel.text 속성에 직접 액세스하는 대신. 메서드 호출을 고수하면 원하는 것을 얻을 수 있습니다.
Rymnel 2014 년

12

Caffeine Coma의 문제가 해결되었지만 UIButton에 제목이 표시되지 않는 또 다른 잠재적 인 원인을 제공하고 싶습니다.

UIButton에 대한 이미지를 설정하면

- (void)setImage:(UIImage *)image forState:(UIControlState)state

제목을 다룰 수 있습니다. 나는 이것을 어려운 방법으로 발견했고 여러분 중 일부가 같은 이유로이 페이지를 읽게 될 것이라고 상상합니다.

대신이 방법 사용

- (void)setBackgroundImage:(UIImage *)image forState:(UIControlState)state

버튼 이미지와 제목은 영향을받지 않습니다.

나는 .xib에서 만든 프로그래밍 방식으로 만든 버튼과 버튼으로 이것을 테스트했습니다.



4

문서가 답을 알려줍니다! UIButton은 사용할 속성 문자열이 이미있는 경우 제목 변경을 무시합니다 (Xcode 인터페이스 빌더를 사용할 때 얻는 기본값 인 것 같습니다).

다음을 사용했습니다.

[self.loginButton 
     setAttributedTitle:[[NSAttributedString alloc] initWithString:@"Error !!!" attributes:nil] 
     forState:UIControlStateDisabled];
[self.loginButton setEnabled:NO];

3

한 가지 더 가능한 원인은 다음과 같습니다.

(id)initWithNibName: ...메서드 에서 버튼의 제목을 설정하려고 하면 버튼 속성은 여전히 ​​nil입니다. 아직 UIButton에 할당되지 않았습니다.

당신은 당신이 좋아하는 방법에 버튼을 설정하고 있는지 확인해야 (void)viewWillLoad하거나 (void)viewWillAppear,하지만 당신은 아마 늦게을 설정하지 않습니다 (void)viewDidAppear.


2

때로는 정말 복잡해질 수 있습니다. 쉬운 방법은 버튼보기 를 " 새로 고침 "하는 것입니다!

//Do stuff to your button here.  For example:

[mybutton setEnabled:YES];

//Refresh it to new state.

[mybutton setNeedsDisplay];

1

나는 이것에 계속 문제가 있었고 유일한 해결책은 이미지와 레이블을 uibutton에 하위보기로 추가하는 것입니다. 그런 다음 주요 문제는 제목이 Attributed 인 UIButton을 사용하고 있다는 것입니다. Plain으로 변경했을 때 titleLabel.text를 설정하는 것만으로도 효과가있었습니다!


1

@funroll은 절대적으로 옳습니다. 여기에서 필요한 것이 무엇인지 확인할 수 있습니다. 함수가 메인 스레드에서만 실행되는지 확인하십시오 . 스레드를 처리하지 않으려면 다음과 같이 할 수 있습니다. NSUserDefaults를 만들고 ViewDidLoad에서 확인 조건이 다른보기에서 버튼을 눌렀는지 여부 (NSUserDefaults에 설정된 다른보기에서 필요한 정보) 및 조건에 따라 필요한 제목에 따라 UIButton, 그래서 [yourButton setTitle : @ "Title"forState : UIControlStateNormal];


이것은 나에게 매우 유용했습니다. 배경 스레드에서 setTitle 및 setNeedsDisplay를 호출하면 View가 훨씬 나중에 업데이트됩니다.
user1111828 nov.

0

메인 스레드에 있는지 확인하십시오.

그렇지 않은 경우에도 버튼 텍스트가 저장됩니다. 디버거에서 개체를 검사 할 때 있습니다. 그러나 실제로 뷰를 업데이트하지는 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.