ios - UIButton 제목 텍스트는 주 스레드에서 업데이트하더라도 업데이트되지 않습니다.





objective-c ios7 xcode5 (21)


이 시도:

[button setTitle:@"Bye" forState:UIControlStateHighlighted];

또는:

[button setTitle:@"Bye" forState:UIControlStateSelected];

void 함수를 수정할 수도 있습니다.

-(void) userClicked
{
    NSLog(@"USER CLICKED!!!");
    if ([NSThread isMainThread])
    {
        NSLog(@"is main thread");
    }

    [myButton setTitle:@"Bye" forState:UIControlStateNormal];
}

내가 프로그래밍 방식으로 만든 UIButton 의 제목을 사용자가 클릭 할 때 변경하려고합니다. 그래서, 이것은 UIButton 을 생성하는 코드입니다.

myButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, parentView.frame.size.width, parentView.frame.size.height)];
[myButton setBackgroundColor:[UIColor blackColor]];
[myButton setAlpha:0.7];
[myButton setTitle:@"Hello" forState:UIControlStateNormal];
[myButton addTarget:self action:@selector(userClicked:) forControlEvents:UIControlEventTouchUpInside];

[parentView addSubview:myButton];

그리고, 내 userClicked: 메서드에서, 내가 할 :

-(void) userClicked:(UIButton*)button
{
    NSLog(@"USER CLICKED!!!");
    if ([NSThread isMainThread])
    {
        NSLog(@"is main thread");
    }

    [button setTitle:@"Bye" forState:UIControlStateHighlighted];
    [button setTitle:@"Bye" forState:UIControlStateNormal];
    [button setTitle:@"Bye" forState:UIControlStateSelected];

    [self someLengthyComputation];
}

이상한 것은 인쇄 된 로그 메시지를 볼 수 있다는 것입니다.

USER CLICKED!!! 
isMainThread

그러나 버튼의 제목은 바뀌지 않습니다! 내가 도대체 ​​뭘 잘못하고있는 겁니까?

편집 : 여러 상태에 대한 제목 설정 중 하나를 작동하지 않습니다.

EDIT2 : Xcode의 디버거 창에 버튼 설명을 인쇄하면 올바른 제목이 표시됩니다!

Printing description of button->_titleView:
<UIButtonLabel: 0xa4c9310; frame = (95 216; 130 22); text = 'Bye'; clipsToBounds = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0xa44f080>>



버튼 유형을 '시스템'대신 '사용자 정의'로 변경하면 예상대로 작동합니다.




이 방법이 도움이 될지 확인하십시오 ... 버튼을 클릭 할 때 buttonToggled ...와 같은 조건을 확인하십시오. changeButtonText와 같은 기능이있을 때 아래와 같이하십시오.

-(IBAction)changeButtonText:(id)sender {
    if (!buttonToggled) {
        [sender setTitle:@"Initial Text" forState:UIControlStateNormal];
        buttonToggled = YES;
    } else {
        [sender setTitle:@"Alternative Text" forState:UIControlStateNormal];
        buttonToggled = NO;
    }
}



iOS 7에서는 UIButton의 제목이 비활성화 되어도 업데이트되지 않습니다. iOS 7의 버그 인 것 같습니다.

이 문제를 해결하려면 정상 및 사용 중지 된 제목을 모두 업데이트하십시오. 그것은 작동합니다!

[button setTitle:title forState:UIControlStateNormal];
[button setTitle:title forState:UIControlStateDisabled];



이것은 나를 위해 제목 텍스트 (iOS 7.1, Xcode 5.1)를 업데이트하는 데 도움이되었습니다.

button.enabled = FALSE;
[button setTitle:@"Test" forState:UIControlStateNormal];
button.enabled = TRUE;



위의 어느 것도 (UIPopoverController로 제시된 뷰의 맨 위에 버튼이있다) 해결할 수 없었고, setTitle, removeSubview 전에 removeFromSuperview를 써야했다. 비슷한 문제가있는 누군가를 도울 수 있기를 바란다.




음, UIButton의 활성화 상태에 관한 것입니다. Apple은 7.1에서 무언가를 변경했습니다. UIButton이 비활성 상태 인 경우 제목을 변경할 수 없습니다.

고마워요, 10 분을 잃었습니다. 잘 작동하는 앱을 디버깅합니다.

그냥 오늘 아침에 발견, 어제 5.1.1로 iOS와 7.1에 XCode를 업데이트했습니다.




스토리 보드를 사용하여 비슷한 문제가 발생했습니다. 위의 답변을 사용하면

[mybutton setTitle:@"SomeText" forState:UIControlStateNormal];
[button setNeedsLayout];
[button layoutIfNeeded];

그리고 버튼 유형이 속성 관리자에서 '시스템'이 아닌 '사용자 정의'였는지 확인해야했습니다.




Apple 개발자 가이드에 따라 버튼 제목 레이블 텍스트 나 색상을 속성으로 직접 설정하면 안됩니다 (예 : myButton.titleLabel.text = @ "SomeText"또는 myButton.titleLabel.textColor = [UIColor blackColor ]).

오히려 UIButton setter 기능을 사용하여 다음과 같이 설정합니다.

    [myButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];

... 또는 이와 같이 :

    [myButton setTitle:@"SomeText" forState:UIControlStateNormal];.

Apple 가이드를 참조하십시오.




이것은 사소한 일 이겠지만 전체 버튼 프레임을 채우는 (배경 이미지 대신) 버튼 이미지를 설정하면 제목이 오른쪽으로 이동하여 보이지 않게됩니다. 그렇다면 버튼 이미지를 배경 이미지로 변경해보십시오.




제 경우에는 모든 것을 시도했지만 아무것도 작동하지 않았습니다. 그런 다음 스토리 보드에서 버튼 유형을 시스템에서 맞춤으로 변경했습니다. 팔! 모든 것이 정상적으로 시작되었습니다.




나는 '버튼'매개 변수로 전달 된 myButton.Anyway, myButton 멤버 var 경우 의심 할 여지 만 [myButton setTitle : @ "안녕"forState : UIControlStateNormal];




Swift 3의 경우 다음을 사용하십시오.

button.setTitle("My title", for: .normal)

또는 귀속 된 텍스트

button.setAttributedTitle(<AttributedString>, for: .normal)



코드에는 몇 가지 문제가 있습니다.

단추에 콜백을 지정하는 중입니다.

@selector(userClicked:)

그러나 당신의 코드는 또 다른 방법이다.

-(void)userTapOnTapToRefreshView:(UIButton*)button

이 문제를 해결하려면 다음과 같이 구현해야합니다.

-(void)userClicked:(id)sender
{
    [(UIButton*)sender setTitle:@"Bye" forState:UIControlStateNormal];
}

또한이 코드 부분은 나를 이해할 수 없습니다.

[parentView myButton];

다음과 같이 변경하십시오.

[parentView addSubview:myButton];

희망이 도움이 될 것입니다 :)




버튼 레이아웃 새로 고침 문제 일 수 있습니다. 사용 해보십시오 ...

[button setNeedsLayout];
[button layoutIfNeeded];

버튼이 레이아웃을 업데이트하도록합니다.




마침내, 나는 그것을 알아 냈다. 두 가지 문제가있었습니다.

1) buttonUIControlStateNormal 상태가 아니 었습니다.

2) 제목을 설정 한 직후에 긴 계산을 수행하는 메소드를 호출했습니다. [self someLengthyComputation] .

나는 그 문제를 다음과 같이 해결했다.

1) 버튼의 모든 상태에 대한 제목 설정.

2) 메인 쓰레드가 아닌 다른 쓰레드에서 큰 계산을 수행한다.

내 작업 코드는 다음과 같습니다.

-(void) userClicked:(UIButton*)button
{
    NSLog(@"USER CLICKED!!!");
    if ([NSThread isMainThread])
    {
        NSLog(@"is main thread");
    }

    [button setTitle:@"Bye" forState:UIControlStateHighlighted];
    [button setTitle:@"Bye" forState:UIControlStateNormal];
    [button setTitle:@"Bye" forState:UIControlStateSelected];
    dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
        [self someLengthyComputation];
    });
}

답변 해 주신 모든 분께 감사드립니다.




다음과 같은 사용 요구 사항은 없습니다.

[button setNeedsLayout];
[button layoutIfNeeded];

대신 DEFAULT를 CUSTOM 으로 설정 하십시오.

setAttributedTitle 을 적용한 경우 다음을 사용하십시오.

[button setAttributedTitle:[NSAttributedString new] forState:UIControlStateNormal];

그렇지 않으면 아무 것도 변경할 필요가 없습니다.

텍스트의 색상이 변경되지 않은 경우 같은 것을 적용하고 제목 색상을 다음과 같이 설정합니다.

[button setTitleColor:[any_color] forState:UIControlStateNormal];



나는 똑같은 문제를 겪고 있었고, 그 밖의 곳에서는 내가 attributedTitle을 설정하고 있다는 것을 알았다. 따라서 제목에 대한 업데이트가 기여한 제목에 영향을 미치지 않았습니다.

내 솔루션 :

[button setAttributedTitle:@"" forState:UIControlStateNormal];

대신에

[button setTitle:@"" forState:UIControlStateNormal];



인터페이스 또는 구현 부분에서보기 /보기 컨트롤러로 버튼을 속성으로 선언하십시오.

@property(nonatomic,strong) UIButton* myButton;

그것을 만든다.

self.myButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, parentView.frame.size.width, parentView.frame.size.height)];
[_myButton setBackgroundColor:[UIColor blackColor]];
...

그것은 작동해야합니다. 왜 나 한테 진짜로 물어 보지 마라. 나는 ARC / Modern memory management에 관한 것이라고 생각한다.

편집하다:

구현의 버튼에 대한 참조를 유지하는 경우에도 작동해야합니다.

@implementation myViewController
{
    UIButton* myButton;
}

-(void)createButton
{
    myButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, parentView.frame.size.width, parentView.frame.size.height)];
    [myButton setBackgroundColor:[UIColor blackColor]];
    ...
}

...



이것은 좀 늦었고 Walter Schurter의 답변과 다소 관련이 있습니다.

7.1로 업데이트 할 때까지 버튼 텍스트를 올바르게 설정 한 것과 비슷한 문제가있었습니다. 그런 다음 버튼이 비활성화 되었기 때문에 텍스트가 표시되도록 비활성화 상태의 제목 색상과 제목 텍스트를 설정해야한다는 것을 알게되었습니다. 모든 것이 매력처럼 작동했습니다!




UIButton 에서 확장 한 MyButton 사용자 지정 클래스를 만들었습니다. 그런 다음 Identity Inspector 추가합니다.

그런 다음 단추 유형을 사용자 지정으로 변경하십시오.

그런 다음 서로 다른 상태에 대해 UIButton textColorUIFont 와 같은 속성을 설정할 수 있습니다.

그런 다음 UIButton 을 강조 표시하도록하려면 MyButton 클래스 내에 두 가지 메서드를 작성해야합니다. 코드 내에서 호출해야합니다.

- (void)changeColorAsUnselection{
    [self setTitleColor:[UIColor colorFromHexString:acColorGreyDark] 
               forState:UIControlStateNormal & 
                        UIControlStateSelected & 
                        UIControlStateHighlighted];
}

- (void)changeColorAsSelection{
    [self setTitleColor:[UIColor colorFromHexString:acColorYellow] 
               forState:UIControlStateNormal & 
                        UIControlStateHighlighted & 
                        UIControlStateSelected];
}

UIControlState 의 문서에 따라 한 번에 여러 상태가있을 수 있으므로 normal, highlight 및 selected UIControlState titleColor 를 설정해야합니다. 이러한 방법을 만들지 않으면 UIButton 은 선택 또는 강조 표시를 표시하지만 UIInterface Builder 설정 한 UIColor 머 무르지 않습니다. 왜냐하면 선택 항목의 짧은 표시에만 사용할 수 있고 선택 자체는 표시 할 수 없기 때문입니다.







ios objective-c uibutton ios7 xcode5