UIButton başlığını / metnini programlı olarak güncellemek mümkün mü?


96

Bir UIButton, basıldığında, kullanıcının bazı ayarları değiştirebileceği yeni bir görünüm açar. Görünüm reddedildiğinde, UIButtonyeni durumu yansıtacak şekilde başlığını / metnini güncellemek istiyorum . Arıyorum:

[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];

Ancak, IB'de belirtildiği gibi orijinal metinden / başlıktan hiçbir zaman değişmiş görünmüyor.


2
Gönderilen kodun arandığından emin misiniz? Bunu kanıtlamak için bir KIRILMA NOKTASI verdiniz mi? Temsilcinizin imzasını atabilir misiniz?
Pablo Santa Cruz

3
Bir kenara, aynı anda birden fazla kontrol durumuna başvurabileceğinize inanıyorum: [myButton setTitle: @ "myTitle" forState :( UIControlStateNormal | UIControlStateApplication | UIControlStateHighlighted | ...)]; Mantıksal OR operatörünün (||) aksine bitsel OR operatörünün kullanımına dikkat edin. Genel olarak, böyle durumlarla uğraşırken, bunları | ile birlikte VEYA yapabilirsiniz. Şebeke. Fena halde yanılıyorsam biri beni düzeltsin. :)
CIFilter

Keşke UIControlStateAll gibi bir tane olsaydı: D
taber

2
Bitsel kombinasyonlar iOS5'te benim için çalışmıyor gibi görünüyor.
Echilon

Burada aynı sorun. Bitsel kombinasyonlar iOS5'te benim için çalışmıyor. / CC @LucasTizma
znq

Yanıtlar:


52

Görünüm denetleyici sınıfınızda bir IBOutlet olarak belirtilen düğme var mı ve Arabirim Oluşturucu'da bir çıkış olarak doğru şekilde bağlanmış mı (ctrl yeni referans çıkışından dosya sahibine sürükleyin ve UIButton nesnenizi seçin)? Bu semptomları gördüğümde genellikle yaşadığım sorun budur.


Düzenleme: Burada durum böyle olmasa da , düğmeye atfedilen bir başlık ayarlarsanız , ardından atıfta bulunulan başlığı değil başlığı değiştirmeye çalışırsanız buna benzer bir şey de olabilir .


4
Bingo, buydu, teşekkürler. Gerçekten Objective-C'nin bu gibi durumlarda bir nil nesnesine mesaj göndermenin normal olduğunu düşünmek yerine, sadece bir NullPointerException oluşturmasını diliyorum. Bu beni neredeyse her gün ısırıyor ... ugh!
George Armhold

20
Çünkü objc, nil bir mesaj göndermek için kendi Tamam 'taklit' etmez ise nil mesaj göndermek için Tamam ...
Jasarien

1
Buradaki sorun sıfır gösterici değildir. Buradaki sorun, IB'nin kodda (IBOutlet aracılığıyla) doğru şekilde referans verilmeyen bir UIButton örneği kurmuş olmasıdır, bu nedenle programla asla değiştirilemez.
CIFilter

113

UIControlStateNormal için başlık parametresini ayarlayarak sorunu çözdüm ve otomatik olarak diğer durumlarda çalışıyor. Sorun, başka bir UIControlState ayarladığınızda ortaya çıkıyor.

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


13

Başka bir problem keşfettim. İOS 5'te tanıtılan bir hata olabilir, ancak onunla karşılaşan herhangi biri için bunu belirteceğimi düşündüm.

XIB'deki düğme için herhangi bir varsayılan metin ayarlamazsanız, programlı olarak ayarlarsanız hiçbir metin görünmez. Ve XIB'de metin ayarlarsanız, daha sonra düğmeye programlı olarak atadığınız herhangi bir metin, varsayılan metnin boyutuna kırpılacaktır.

Son olarak, görünümü düğmenizle gösteriyor ve ardından başka bir görünümü (Eylem Sayfası gibi) çağırıp reddederseniz, düğmeye programlı olarak atadığınız metin silinecek ve düğme başlığı ayarladığınız şeye geri dönecektir. XIB'de.


1
Bu üç davranışı da fark ettim ve kesinlikle sinir bozucu.
Flea

2
Kısaltma sorunum vardı (metni programlı olarak daha uzun bir şeye değiştirmek), bu yüzden metni daha uzun bir kelimeye değiştirdiğimde bu alanı 'ayırmak' için metnin sonuna fazladan boşluklar koydum. Bu benim için çalıştı.
mattorb

2
Bunun düzeltmesinin, [_button setTitle: @ "title" forState: UIControlStateNormal] yöntemini kullanmak olduğu anlaşılıyor; _button.titleLabel.text özelliğine doğrudan erişmek yerine. Yöntem çağrısına sadık kalın ve muhtemelen istediğinizi alacaksınız.
Rymnel

12

Kafein Koma sorunu çözülmüş olsa da, başlığın bir UIB düğmesinde görünmemesi için başka bir olası neden sunmak istiyorum.

Kullanarak UIButton için bir resim ayarlarsanız

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

Başlığı kapsayabilir. Bunu zor yoldan buldum ve bazılarınızın bu sayfayı aynı nedenle okuduğunu hayal ediyorum.

Bunun yerine bu yöntemi kullanın

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

düğme resmi ve başlık için etkilenmeyecektir.

Bunu, .xib dosyasında oluşturulan programla oluşturulmuş düğmeler ve düğmelerle test ettim


7

hızlı için:

button.setTitle("Swift", forState: UIControlState.Normal)                   

4

Doktorların sana cevabı söylediği ortaya çıktı! UIButton, halihazırda kullanılacak bir Attributed String'e sahipse başlık değişikliğini göz ardı edecektir (Xcode arayüz oluşturucuyu kullanırken aldığınız varsayılan değer ile).

Aşağıdakileri kullandım:

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

3

Bir başka olası neden şudur:

(id)initWithNibName: ...Yöntemde düğmenin başlığını ayarlamaya çalışırsanız , düğme özelliğiniz hala sıfır olacaktır. Henüz UIB düğmesine atanmamış.

Düğmelerinizi (void)viewWillLoadveya gibi bir yöntemle ayarladığınızdan emin olmalısınız (void)viewWillAppear, ancak büyük olasılıkla bu kadar geç ayarlamak istemezsiniz (void)viewDidAppear.


2

Bazen gerçekten karmaşıklaşabilir. Kolay yol, düğme görünümünü " yenilemektir "!

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

[mybutton setEnabled:YES];

//Refresh it to new state.

[mybutton setNeedsDisplay];

1

Bununla ilgili sorun yaşamaya devam ettim, tek çözüm, uibuttona alt görünümler olarak bir resim ve etiket eklemekti. Sonra asıl sorunun şu başlıklı bir UIButton kullanmam olduğunu keşfettim: Attributed. Bunu Plain olarak değiştirdiğimde, sadece titleLabel.text'i ayarlamak hile yaptı!


1

@funroll kesinlikle haklı. Burada neye ihtiyacınız olduğunu görebilirsiniz. Emin ol işlevinin yalnızca ana iş parçacığında çalıştığından emin olun . İş parçacıklarıyla ilgilenmek istemiyorsanız, örneğin şu şekilde yapabilirsiniz: NSUserDefaults oluşturun ve ViewDidLoad cheking koşulunda başka bir Görünümde düğmeye basıldı veya basılmadı (NSUserDefaults'da başka bir Görünüm kümesinde gerekli bilgiler) ve koşullara bağlı olarak sizin UIButton'unuz, dolayısıyla [yourButton setTitle: @ "Title" forState: UIControlStateNormal];


Bu benim için çok faydalı oldu .. eğer setTitle ve setNeedsDisplay'i bir arka plan iş parçacığından çağırırsanız, Görünüm çok daha sonra güncellenecektir.
user1111828

0

Ana başlıkta olduğunuzdan emin olun.

Değilse, yine de düğme metnini kaydedecektir. Hata ayıklayıcıdaki nesneyi incelediğinizde orada olacaktır. Ancak görünümü aslında güncellemeyecektir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.