Reactivecocoa: NSControl -rac_textSignal tidak berfungsi saat menyetel teks secara terprogram

Dibuat pada 27 Agu 2013  ·  8Komentar  ·  Sumber: ReactiveCocoa/ReactiveCocoa

Jika saya menyetel teks pada NSTextField terprogram melalui -setStringValue: atau -setAttributedStringValue: , ini tidak memicu NSControlTextDidChangeNotification , yang berarti -rac_textSignal won juga tidak mengambil kembalian. Ini hanya berfungsi ketika teks sedang diedit oleh interaksi pengguna.

Perbaikan mudah akan menggunakan -rac_signalForSelector: untuk mencegat panggilan ke setter juga (selain mendaftar untuk NSControlTextDidChangeNotification ). Ada ide lain?

question

Komentar yang paling membantu

Saya tahu ini telah ditutup untuk waktu yang lama tetapi saya menemukan solusi untuk masalah Anda @indragiek.
Misalkan Anda memiliki properti, NSString* name di viewModel Anda.
Di pengontrol tampilan Anda, saat mengikat kolom teks ke model tampilan dan sebaliknya, lakukan ini:
[[RACSignal merge:@[self.nameField.rac_textSignal, RACObserve(self.nameField, text)]]<br i="9"/> subscribeNext:^(NSString* text){<br i="10"/> self.viewModel.name = text;<br i="11"/> }];`

Dengan cara ini Anda mendeteksi setiap kali sinyal teks mengaktifkan AND untuk perubahan programatik pada properti teks.

Semua 8 komentar

Konsistensi dengan AppKit di sini adalah sebuah fitur, bukan bug. Ini akan menjadi aneh, IMO, untuk rac_textSignal disulut untuk peristiwa yang tidak dapat diamati secara konvensional.

Ini tidak selalu masuk akal, tetapi umumnya peristiwa yang menyebar ke lapisan tampilan harus dianggap "final". Jika Anda perlu memfilter atau mengubahnya sebelum titik itu, itu harus dilakukan melalui model tampilan atau sesuatu di sepanjang garis itu.

Apa kasus penggunaan untuk mengamati perubahan terprogram?

Contoh khusus: Saya memiliki formulir dengan beberapa bidang teks dan tombol Hapus, mengklik Hapus set stringValue pada setiap bidang teks menjadi @"" . Saya menggunakan rac_textSignal untuk beberapa logika validasi formulir, dan status validasi tidak diperbarui saat Clear diklik karena -rac_textSignal tidak mengambil perubahan. Satu-satunya solusi adalah memposting NSControlTextDidChangeNotification secara manual, yang merupakan hal yang mengerikan untuk dilakukan: trollface:

Dalam hal MVVM , desain yang benar adalah melakukan validasi pada _view model_, bukan pada tampilan. Model tampilan akan memiliki ikatan dua arah ke bidang teks. Kemudian, tombol Hapus dapat mengatur ulang bidang model tampilan, dan semuanya: berkilau :

MVC akan cukup mirip, hanya dengan pengontrol tampilan perantara atau model sebagai gantinya.

Saya telah mempertimbangkannya, tetapi menggunakan binding adalah masalah tersendiri dalam kasus saya. Itu tidak relevan dengan pertanyaan ini, jadi saya pikir ini bisa ditutup. Terima kasih!

FWIW, bahkan jika Cocoa Bindings ™ menjadi masalah, Anda dapat menggunakan RACChannel untuk membuat binding dua arah Anda sendiri yang tidak bergantung padanya.

Saya tahu ini telah ditutup untuk waktu yang lama tetapi saya menemukan solusi untuk masalah Anda @indragiek.
Misalkan Anda memiliki properti, NSString* name di viewModel Anda.
Di pengontrol tampilan Anda, saat mengikat kolom teks ke model tampilan dan sebaliknya, lakukan ini:
[[RACSignal merge:@[self.nameField.rac_textSignal, RACObserve(self.nameField, text)]]<br i="9"/> subscribeNext:^(NSString* text){<br i="10"/> self.viewModel.name = text;<br i="11"/> }];`

Dengan cara ini Anda mendeteksi setiap kali sinyal teks mengaktifkan AND untuk perubahan programatik pada properti teks.

@startupthekid terima kasih, ini membantu saya.

@startupthekid terima kasih banyak!

Apakah halaman ini membantu?
0 / 5 - 0 peringkat