Mendapatkan Nilai dari UITextField saat penekanan tombol dimasukkan?

107

Katakanlah saya memiliki kode berikut:

IBOutlet UITextField* nameTextField;
IBOutlet UILabel* greetingLabel;

Saya ingin greetingLabelmembaca "Halo [nameTextField]" segera setelah pengguna menekan tombol apa saja.

Yang saya butuhkan pada dasarnya adalah iPhone yang setara dengan metode delegasi Kakao controlTextDidChange.

The textField:shouldChangeCharactersInRange:metode delegasi disebut setiap kali keystroke terjadi:

- (BOOL)              textField:(UITextField *)textField
  shouldChangeCharactersInRange:(NSRange)range     
              replacementString:(NSString *)string

Argumen string mengembalikan karakter yang ditekan. Namun nilai sebenarnya textField( nameTextField.text) tetap kosong.

Apa yang kulewatkan di sini? (Saya ingin nameTextFieldmencerminkan string persis yang telah dimasukkan pengguna sejauh ini).

PlagueHammer
sumber

Jawaban:

197

Ternyata, cara termudah untuk melakukannya adalah menggunakan Interface Builder:

  • Tambahkan IBAction (ke ViewController, katakanlah, seperti dalam kasus ini)
  • Ctrl-Click (atau klik kanan) pada UITextField di Interface Builder
  • Hubungkan acara "Mengedit Berubah" ke IBAction Pemilik File yang ditambahkan di langkah pertama.

Bekerja seperti pesona :) (Saya tidak percaya saya menghabiskan banyak hari untuk ini, dan untuk menyadari sekarang bahwa solusinya jauh lebih sederhana daripada yang saya kira: P)

PlagueHammer
sumber
2
Terima kasih! Saya telah menggunakan "Nilai Berubah" seperti yang Anda gunakan dengan UISlider, dll. Menarik bahwa mereka memiliki dua peristiwa yang tampaknya memiliki perilaku yang sama.
wjl
1
Untuk beberapa alasan saya masih menginginkan cara terprogram untuk melakukan ini ... tetapi saya menyerah ... Metode ini Rocks! Terima kasih telah berbagi ... Saya telah melihatnya sebelumnya tetapi setelah berhari-hari mengkodekan otak saya tidak berfungsi lagi hehe.
Albert Renshaw
8
@AlbertRenshaw Tapi Anda bisa melakukan ini dengan cara terprogram;) Lakukan saja [textField addTarget:self action:@selector(textFieldEditingChanged:) forControlEvents:UIControlEventEditingChanged];).
Hidupkan
101

Anda dapat mendaftarkan tindakan untuk acara UIControlEventEditingChanges di bidang teks:

[nameTextField addTarget:self action:@selector(updateLabelUsingContentsOfTextField:) forControlEvents:UIControlEventEditingChanged];

...

// TODO: error checking

- (void)updateLabelUsingContentsOfTextField:(id)sender {

    greetingLabel.text = [NSString stringWithFormat:@"Hello %@", ((UITextField *)sender).text];

}

sumber
Apakah ada cara untuk menentukan ini menggunakan Interface Builder?
PlagueHammer
11

UITextFieldmemiliki pemberitahuan UITextFieldTextDidChangeyang akan diaktifkan setiap kali teks berubah jika Anda mendaftar untuk itu. Cukup daftar untuk notifikasi itu dan dalam metode yang dipanggil dengan notifikasi, ubah teks label.

Untuk menambahkannya, objek yang diteruskan ke penangan notifikasi Anda akan memiliki teks UITextField.

Semoga membantu.

lostInTransit
sumber