apakah mungkin memperbarui judul / teks UIButton secara terprogram?

96

Saya memiliki UIButton, yang ketika ditekan, menampilkan tampilan baru di mana pengguna dapat mengubah beberapa pengaturan. Saat tampilan ditutup, saya ingin memperbarui judul / teks UIButtonuntuk mencerminkan keadaan baru. Saya menelepon:

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

Tetapi sepertinya tidak pernah berubah dari teks / judul asli sebagaimana ditentukan dalam IB.

George Armhold
sumber
2
Apakah Anda yakin kode yang dikirim dipanggil? Apakah Anda menempatkan BREAKPOINT untuk membuktikannya? Bisakah Anda memposting tanda tangan delegasi Anda?
Pablo Santa Cruz
3
Selain itu, saya yakin Anda dapat mereferensikan beberapa status kontrol sekaligus: [myButton setTitle: @ "myTitle" forState :( UIControlStateNormal | UIControlStateApplication | UIControlStateHighlighted | ...)]; Perhatikan penggunaan operator OR bitwise sebagai lawan dari operator OR logika (||). Secara umum, ketika Anda berurusan dengan negara bagian seperti ini, Anda dapat ATAU mereka bersama dengan | operator. Seseorang mengoreksi saya jika saya sangat salah. :)
CIFilter
Saya berharap mereka punya yang seperti UIControlStateAll: D
taber
2
Kombinasi bitwise sepertinya tidak berhasil untuk saya di iOS5.
Echilon
Masalah yang sama di sini. Kombinasi bitwise tidak berfungsi untuk saya di iOS5. / CC @LucasTizma
znq

Jawaban:

52

Apakah Anda memiliki tombol yang ditentukan sebagai IBOutlet di kelas pengontrol tampilan Anda, dan apakah itu terhubung dengan benar sebagai outlet di Interface Builder (ctrl seret dari outlet referensi baru ke pemilik file dan pilih objek UIButton Anda)? Biasanya itulah masalah yang saya alami ketika saya melihat gejala-gejala ini.


Sunting: Meskipun tidak demikian, hal seperti ini juga dapat terjadi jika Anda menyetel judul yang dikaitkan ke tombol, lalu Anda mencoba mengubah judul dan bukan judul yang dikaitkan.

Ken Pespisa
sumber
4
Bingo, itu dia, terima kasih. Saya benar-benar berharap Objective-C hanya akan melemparkan NullPointerException dalam kasus seperti ini, alih-alih diam-diam berpura-pura bahwa tidak apa-apa untuk mengirim pesan ke objek nil. Ini menggigit saya hampir setiap hari ... ugh!
George Armhold
20
ObjC tidak 'berpura-pura' OK untuk mengirim pesan ke nil, karena adalah OK untuk mengirim pesan ke nil ...
Jasarien
1
Masalahnya di sini bukanlah pointer nol. Masalahnya adalah IB telah menyiapkan instance UIButton yang tidak direferensikan dengan benar dalam kode (melalui IBOutlet), sehingga tidak pernah dapat dimanipulasi secara terprogram.
CIFilter
112

Saya memecahkan masalah hanya dengan mengatur parameter judul untuk UIControlStateNormal, dan secara otomatis bekerja di negara bagian lain. Masalahnya tampaknya ketika Anda mengatur UIControlState lain.

[myButton setTitle: @"myTitle" forState: UIControlStateNormal];
Yotes
sumber
15

Mulai Swift 4:

    button.setTitle("Click", for: .normal)
Vlad Spreys
sumber
13

Saya menemukan masalah lain. Ini mungkin bug yang diperkenalkan di iOS 5, tapi saya pikir saya akan menunjukkannya kepada siapa pun yang menemuinya.

Jika Anda tidak menyetel teks default apa pun untuk tombol di XIB, tidak ada teks yang akan muncul jika Anda menyetelnya secara terprogram. Dan jika Anda mengatur teks di XIB, teks apa pun yang Anda tetapkan ke tombol secara terprogram akan dipotong ke ukuran teks default.

Dan terakhir, jika Anda menampilkan tampilan dengan tombol Anda dan kemudian memanggil tampilan lain (seperti ActionSheet) dan kemudian menutupnya, teks yang Anda tetapkan ke tombol secara terprogram akan dihapus dan judul tombol akan kembali ke apa pun yang Anda tetapkan di XIB.

Oscar
sumber
1
Saya telah memperhatikan ketiga perilaku ini dan itu tentu saja mengganggu.
Flea
2
Saya mengalami masalah pemotongan (mengubah teks menjadi sesuatu yang lebih panjang secara terprogram), jadi saya memberi spasi ekstra di akhir teks untuk 'memesan' ruang itu ketika saya mengubah teks menjadi kata yang lebih panjang. Itu berhasil untuk saya.
mattorb
2
Tampaknya perbaikan untuk ini adalah dengan menggunakan metode [_button setTitle: @ "title" forState: UIControlStateNormal]; alih-alih mengakses properti _button.titleLabel.text secara langsung. Tetap gunakan metode panggilan dan Anda mungkin akan mendapatkan apa yang Anda inginkan.
Rymnel
12

Meskipun masalah Caffeine Coma telah teratasi, saya ingin menawarkan penyebab potensial lain untuk judul tidak muncul di UIButton.

Jika Anda mengatur gambar untuk UIButton menggunakan

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

Itu bisa menutupi judul. Saya menemukan ini dengan cara yang sulit dan membayangkan beberapa dari Anda akhirnya membaca halaman ini karena alasan yang sama.

Gunakan metode ini sebagai gantinya

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

untuk gambar tombol dan judul tidak akan terpengaruh.

Saya menguji ini dengan tombol dan tombol yang dibuat secara terprogram yang dibuat dalam .xib

Jesse Black
sumber
7

untuk cepat:

button.setTitle("Swift", forState: UIControlState.Normal)                   
Dara Tith
sumber
4

Ternyata dokumen memberi tahu Anda jawabannya! UIButton akan mengabaikan perubahan judul jika sudah memiliki Attributed String untuk digunakan (tampaknya menjadi default yang Anda dapatkan saat menggunakan Xcode interface builder).

Saya menggunakan yang berikut ini:

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

Satu lagi kemungkinan penyebabnya adalah ini:

Jika Anda mencoba menyetel judul tombol dalam (id)initWithNibName: ...metode tersebut, properti tombol Anda akan tetap nihil. Ini belum ditugaskan ke UIButton.

Anda harus yakin bahwa Anda menyetel tombol dengan metode seperti (void)viewWillLoadatau (void)viewWillAppear, tetapi Anda mungkin tidak ingin menyetelnya selambat-lambatnya (void)viewDidAppear.

Ramsey
sumber
2

Terkadang bisa menjadi sangat rumit. Cara termudah adalah dengan " menyegarkan " tampilan tombol!

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

[mybutton setEnabled:YES];

//Refresh it to new state.

[mybutton setNeedsDisplay];
Mike Rapadas
sumber
1

Saya terus mengalami masalah dengan ini, satu-satunya solusi adalah menambahkan gambar dan label sebagai subview ke uibutton. Kemudian saya menemukan bahwa masalah utamanya adalah saya menggunakan UIButton dengan judul: Attributed. Ketika saya mengubahnya menjadi Plain, cukup mengatur titleLabel.text sudah cukup!

Menandai
sumber
1

@unroll benar sekali. Di sini Anda dapat melihat apa yang Anda perlukan. Pastikan fungsi hanya berjalan di thread utama . Jika Anda tidak ingin berurusan dengan utas Anda dapat melakukan seperti ini misalnya: membuat NSUserDefaults dan dalam kondisi cheking ViewDidLoad ditekan tombol di View lain atau tidak (di View lain yang ditetapkan di NSUserDefaults informasi yang dibutuhkan) dan tergantung pada kondisi set judul yang diperlukan untuk UIButton Anda, jadi [yourButton setTitle: @ "Title" forState: UIControlStateNormal];

daleijn
sumber
Ini sangat berguna bagi saya .. ternyata jika Anda memanggil setTitle dan setNeedsDisplay dari utas latar belakang, Tampilan akan diperbarui lebih lama lagi.
user1111828
0

Pastikan Anda berada di utas utama.

Jika tidak, teks tombol masih akan disimpan. Ini akan ada di sana saat Anda memeriksa objek di debugger. Tapi itu tidak benar-benar memperbarui tampilan.

funroll
sumber