Текстът на заглавието на UIButton не се актуализира дори ако го актуализирам в главната нишка

Опитвам се да променя заглавието на 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

Но заглавието на бутона не се променя! какво правя грешно

РЕДАКТИРАНЕ: Задаването на заглавие за няколко състояния също не работи.

РЕДАКТИРАНЕ 2: Ако отпечатам описанието на бутона в прозореца за отстраняване на грешки на Xcode, той показва правилното заглавие!

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

person neutrino    schedule 14.11.2013    source източник
comment
Може би вашият бутон не е в State UIControlStateNormal?   -  person user1567896    schedule 14.11.2013
comment
Къде сте добавили бутон като подизглед?   -  person Vishwa Patel    schedule 14.11.2013
comment
Какво е parentView ..?   -  person Anand Suthar    schedule 14.11.2013
comment
@AnandK parentView е основният UIView на UIViewController   -  person neutrino    schedule 14.11.2013
comment
@VishwaPatel Вижте отговора на AnandK, моля.   -  person neutrino    schedule 14.11.2013
comment
@user1567896 Нека опитам...   -  person neutrino    schedule 14.11.2013
comment
@user1567896 Ти беше прав! В състояние е UIControlStateHighlited!   -  person neutrino    schedule 14.11.2013
comment

Какво получавам досега:

Използвам RasPi B+ с Raspbian OS.

Какво опитах досега: Twinkle (инсталирайте със sudo apt-get install twinkle)

Когато е конфигуриран, можете да го използвате чрез CLI, но за съжаление не успях да конфигурирам Twinkle чрез командния ред. Трябваше да конфигурирам X-Forwarding за моя Mac. Инсталирах X11 (респ. XQuartz) за Mac. Така че успях да видя GUI и да конфигурирам Twinkle.

Какво проработи: Успях да изпращам съобщения, но когато получих обаждане, Twinkle се срина. Трябва да заявя, че в момента няма инсталирани звукови устройства (без микрофон, без високоговорители).

След това потърсих SFL Phone. Това не идва с CLI. Така че не си струва да го тествате.

Четох и за Linphone. В момента не съм го пробвал, защото някои хора съобщават за трудности при използването му в собствени приложения.

Последното нещо, което намерих, е PJSIP.

Инсталирах го така:

sudo su - 
apt-get install subversion
svn checkout http://svn.pjsip.org/repos/pjproject/trunk
apt-get install build-essential automake autoconf libtool libasound2-dev libpulse-dev libssl-dev libsamplerate0-dev libcommoncpp2-dev libccrtp-dev libzrtpcpp-dev libdbus-1-dev libdbus-c++-dev libyaml-dev libpcre3-dev libgsm1-dev libspeex-dev libspeexdsp-dev libcelt-dev
cd trunk
./configure && make dep && make clean && make && make install

Това отне известно време и има приличен CLI. Успях да изпращам и получавам обаждания. Засега чакам моята USB звукова карта, микрофон и някои високоговорители, за да направя пълно тестване.

  -  person neutrino    schedule 14.11.2013


Отговори (24)


Това работи за мен, за да актуализирам текста на заглавието (iOS 7.1, Xcode 5.1):

button.enabled = FALSE;
[button setTitle:@"Test" forState:UIControlStateNormal];
button.enabled = TRUE;
person Walter Schurter    schedule 20.03.2014
comment
нищо освен този трик не ми помогна. спря да актуализира заглавието, откакто преминах към XCode5.1/iOS7.1. много е досадно. - person Boris Gafurov; 18.04.2014
comment
Изглежда, че е известна грешка в iOS7.1 SDK. prod.lists.apple.com/archives/cocoa- dev/2014/Mar/msg00274.html - person Ramon Poca; 28.04.2014
comment
Това наистина ме накара да прокарам юмрук през монитора си. Голям улов. - person rmigneco; 11.06.2014
comment
Точно същият проблем тук с iOS 7.1 и Xcode 5. Страхотна уловка. Един досаден бъг! - person Robert J. Clegg; 22.07.2014
comment
Имах същия проблем, но използването на layoutSubviews изглежда го поправи. - person Saltymule; 06.10.2014
comment
Това ми се случваше само на iOS 7 и това го поправи. Благодаря. - person Gabriel Cartier; 17.12.2014
comment
Използването на setTitle вместо button.titleLabel.text работи за мен. - person J2N; 24.08.2016

Имах същия проблем и забелязах, че навсякъде другаде задавах attributedTitle. Така че никакви актуализации на заглавието не засягат приписаното заглавие.

Моето решение:

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

вместо

[button setTitle:@"" forState:UIControlStateNormal];
person Jeffrey Sun    schedule 16.06.2014
comment
Това беше проблемът за мен: по-рано се позовах на заглавието на бутона, използвайки приписан низ, за ​​да коригирам проследяването, и вече нямаше да се актуализира, ако просто използвах setTitle. Обърнете внимание, че не можете да подадете прост низ, имате нужда от нещо подобно: [_myButton setAttributedTitle:[[NSAttributedString alloc] initWithString:@Ново заглавие за атрибути на бутон:nil] forState:UIControlStateNormal]; - person CraicDesign; 06.12.2014
comment
Аз съм на XCode 9.4.1 / swift и имах същия проблем. setAttributedTitle беше единственото решение, което работеше за мен - person budiDino; 01.10.2018

В момента най-кратката работа, с която дойдох, е да се обадя:

[button setNeedsLayout];

След актуализиране на заглавието.

Това изглежда се случва в iOS 7.1. Всички мои бутони, които се държаха правилно в предишни версии на iOS (или може би просто компилирани с предишни SDK), изведнъж спряха да го правят, когато бяха компилирани в Xcode 5.1.1 SDK 7.1.

Изглежда като грешка на Apple.

person Lukasz    schedule 02.06.2014
comment
е вярно. [button setNeedsLayout] ще свърши работа в iOS 7.1 - person Deepak Thakur; 22.10.2014
comment
Това все още се изисква за мен в iOS 9.2 - person Charlie Martin; 22.12.2015

Имах подобен проблем с използването на сторибордове. Използвайки отговорите по-горе, трябваше да използвам

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

И трябваше да се уверя, че типът бутон е „По избор“, а не „Системен“ в инспектора на атрибутите.

person user3000868    schedule 09.01.2015
comment
С това И ... коментар ми спасихте деня !!! Благодаря ти. Това беше - никога не забравяйте да настроите бутона на потребителски в сценария, когато правите подклас, в противен случай поведението може да е странно. - person Vilém Kurz; 06.10.2016
comment
Благодаря, благодаря, благодаря. Разбивах си главата от 1 седмица. Вашата и част направи деня ми.. - person Swayambhu; 08.02.2017
comment
Трябваше само да задам типа на Custom, не трябваше да добавя setNeedsLayout или layoutIfNeeded. - person christophercotton; 31.05.2017
comment
Благодаря, спасихте деня ми, като посочихте стила на бутона в сценария! Проблемът ми всъщност беше, че стилът на бутона, зададен в сценария, беше System, а не Custom :) - person Eugenio; 19.06.2018
comment
[бутон setNeedsLayout]; и [оформление на бутон, ако е необходимо]; са едно и също нещо с една разлика. Първият работи асинхронно, а вторият работи синхронно. Така че всеки от тях работи добре, - person Rehan Ali; 05.08.2018

Моля, вижте дали това може да ви помогне...когато се щракне върху бутона, проверете за условие, ако 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;
    }
}
person bachman    schedule 14.11.2013

Има няколко проблема във вашия код:

Вие присвоявате обратно повикване на бутона:

@selector(userClicked:)

но вашият код е в друг метод:

-(void)userTapOnTapToRefreshView:(UIButton*)button

За да коригирате това, трябва да внедрите нещо подобно:

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

Също така тази част от кода няма смисъл за мен:

[parentView myButton];

Опитайте да го промените на:

[parentView addSubview:myButton];

Надявам се, че ще помогне :)

person Eugene Tartakovsky    schedule 14.11.2013
comment
Благодаря ви много за отговора. Всъщност всички тези грешки бяха направени от мен, когато се опитвах да премахна истинския си код, за да публикувам въпроса си тук. Редактирах оригиналната си публикация, за да покажа правилния код с промените, които посочихте. - person neutrino; 14.11.2013

За Swift 3 до 5 просто използвайте следното:

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

или за приписан текст използвайте това:

button.setAttributedTitle(<AttributedString>, for: .normal)
person zero3nna    schedule 22.03.2017

Това е доста късно и донякъде е свързано с отговора на Walter Schurter:

Имах подобен проблем, при който текстът на бутона ми беше зададен правилно, докато не актуализирах до 7.1. След това открих, че тъй като бутонът ми беше деактивиран, трябваше да задам цвета на заглавието и текста на заглавието за деактивирано състояние, за да накарам текста да се покаже. Тогава всичко работи като чар!

person dragonflyesque    schedule 09.04.2014

В iOS 7 заглавието на UIButton не се актуализира, когато е деактивирано. Изглежда като грешка в iOS 7.

Като заобиколно решение актуализирайте както нормалното, така и заглавието с увреждания. Работи!

[button setTitle:title forState:UIControlStateNormal];
[button setTitle:title forState:UIControlStateDisabled];
person ccoroom    schedule 06.03.2015
comment
Обичам те @ccoroom. Спаси нощта ми. - person John Doe; 12.07.2015
comment
Също така можете да пишете в един ред по следния начин: [button setTitle:title forState:UIControlStateNormal | UIControlStateDisabled]; - person Bohdan Savych; 29.08.2016

Опитайте тази:

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

or:

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

Можете също така да промените вашата void функция:

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

    [myButton setTitle:@"Bye" forState:UIControlStateNormal];
}
person Nikos M.    schedule 14.11.2013
comment
Благодаря! [button setTitle:@"Bye" forState:UIControlStateHighlighted]; се справи! - person neutrino; 14.11.2013
comment
Добре, моя грешка, дори и да задам заглавие за UIControlStateNormal, UIControlStateSelected и UIControlStateHighlighted, заглавието не се променя. Ще актуализирам въпроса си с действителния си код. - person neutrino; 14.11.2013
comment
Редактирах и моя отговор. Декларирайте myButton като свойство, за да можете да се позовавате на него във функцията void. - person Nikos M.; 14.11.2013
comment
не работи :(, проблемът не е свързан с mainthread, защото можете да актуализирате бутона, ако не сте навигирали до друг Uiviewcontroller - person Amr Angry; 21.08.2016

В моя случай опитах всичко, но нищо не работи. След това току-що промених типа бутон от системен на потребителски от сценария. БУМ! всичко започна да се държи нормално.

person Siddhesh Mahadeshwar    schedule 27.04.2016

Променете типа на бутона на „Персонализиран“, вместо на „Системен“ и той ще работи според очакванията :)

person Pulkit Arora    schedule 04.02.2017

Е, всичко се отнася до активираното състояние на UIButton, Apple промени нещо в 7.1, което не ви позволява да промените заглавието, ако имате UIButton в дезактивирано състояние, това е всичко.

Благодаря, Apple, загубих 10 минути. отстраняване на грешки в приложение, което работи добре.

Току-що разбрах тази сутрин, вчера получих актуализация на XCode до 5.1.1 и iOS до 7.1

person Kiko Seijo    schedule 08.05.2014

Може да е проблемът с опресняването на оформлението на бутоните..... Опитайте да използвате...

[button setNeedsLayout];
[button layoutIfNeeded];

Това ще принуди бутона да актуализира оформлението.

person iOSGuest    schedule 14.10.2014

Най-накрая го разбрах. Имаше два проблема:

1) button не е бил в състояние UIControlStateNormal.

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];
    });
}

Благодаря много на всички, които отговориха/коментираха!

person neutrino    schedule 14.11.2013
comment
не работи :(, проблемът не е свързан с mainthread, защото можете да актуализирате бутона, ако не сте навигирали до друг Uiviewcontroller - person Amr Angry; 21.08.2016

Това може да е тривиално, но ако зададете изображение на бутон (вместо фоново изображение), което запълва цялата рамка на бутона, това ще измести заглавието надясно и по този начин ще го направи невидим. Ако е така, опитайте да промените изображението на бутона на фоново изображение.

person dobranoc    schedule 19.01.2016

Според ръководството за разработчици на Apple не трябва да задавате текста или цвета на етикета на заглавието на бутона директно като свойство (например не правете това: myButton.titleLabel.text=@"SomeText" или myButton. titleLabel.textColor=[UIColor blackColor]).

По-скоро ги задавате с помощта на функцията за настройка на UIButton, като тази:

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

... или така:

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

Вижте ръководството на Apple.

person Epsilon3    schedule 13.06.2014
comment
Не и когато публикувах отговора си. - person Epsilon3; 18.08.2016
comment
А, има ли някакъв начин да кажем това? - person calql8edkos; 18.08.2016

Заключението след изпробване на много решения е да използвате setAttributedTitle вместо setTitle.

За да направите заглавния низ за AttributedString:

NSMutableAttributedString *attString = [[NSMutableAttributedString alloc] initWithString:@" new Test "];

[button setAttributedTitle:attString forState:UIControlStateNormal];

Между другото, този проблем не се случва от време на време нормално, но внезапно се появява главно поради следните причини:

  1. Ако промените активираното състояние на UIButton и опитате да промените заглавието.

  2. Ако използвате приписана стойност и след това искате да я промените с помощта на setTitle, приписаната стойност е по-добра от заглавието в този случай.

  3. Ако отидете до друг контролер за преглед и след това се върнете обратно, за да актуализирате заглавието на бутона.

person Amr Angry    schedule 22.08.2016

Няма изискване да използвате:

[button setNeedsLayout];
[button layoutIfNeeded];

Вместо това първо задайте тип като DEFAULT на CUSTOM

Ако сте приложили setAttributedTitle, използвайте:

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

В противен случай няма нужда да променяте нищо.

Ако цветът на текста не се е променил, приложете същото и задайте цвят на заглавието с:

[button setTitleColor:[any_color] forState:UIControlStateNormal];
person jenish    schedule 23.07.2016

Нищо от изброеното по-горе не проработи в моя случай (имах бутон върху изглед, представен с UIPopoverController), и трябваше да изтрияFromSuperview преди setTitle, след това да добавяSubview обратно - надявам се това да помогне на някой с подобни проблеми

person hyouuu    schedule 11.06.2017

Съмнявам се дали 'button', предадено като параметър, е myButton. Както и да е, ако myButton е членска променлива, можете просто [myButton setTitle:@"Bye" forState:UIControlStateNormal];

person Hunter    schedule 14.11.2013
comment
Проверих това и бутонът всъщност е равен на myButton. Проблемът беше в състоянието на бутона. Вижте приетия отговор. Благодаря ти все пак! - person neutrino; 14.11.2013
comment
Мислех, че ще промениш текста, след като докоснеш бутона завинаги. Както и да е, поздравления. - person Hunter; 14.11.2013

Опитайте се да декларирате бутона си като свойство, или в интерфейса, или в частта за изпълнение на вашия изглед / изглед контролер

@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 / Съвременно управление на паметта..

РЕДАКТИРАНЕ:

Също така трябва да работи, ако запазите препратка към бутона във вашата реализация.

@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]];
    ...
}

...
person Moose    schedule 05.09.2016

вместо yourButton.titleLabel?.text = "T"

използвайте това yourButton.setTitle("TITLE", за: .normal)

person Divyanshu Kumar    schedule 23.10.2018

Винаги правете addSubview, преди да зададете текста на UIButton.

person PPVZ    schedule 03.09.2014
comment
Можете ли да публикувате някакъв код, за да илюстрирате какво имате предвид? - person DanM7; 04.09.2014
comment
Не можем да разберем какво имате предвид. - person ondermerol; 23.01.2017