Reactivecocoa: لا يعمل NSControl -rac_textSignal عند تعيين النص برمجيًا

تم إنشاؤها على ٢٧ أغسطس ٢٠١٣  ·  8تعليقات  ·  مصدر: ReactiveCocoa/ReactiveCocoa

إذا قمت بتعيين نص على NSTextField برمجيًا عبر -setStringValue: أو -setAttributedStringValue: ، فلن يؤدي هذا إلى تشغيل NSControlTextDidChangeNotification ، مما يعني أن -rac_textSignal فاز لا تلتقط التغيير أيضا. إنه يعمل فقط عندما يتم تحرير النص من خلال تفاعل المستخدم.

سيكون الحل السهل هو استخدام -rac_signalForSelector: لاعتراض المكالمات إلى المستوطنين أيضًا (بالإضافة إلى التسجيل مقابل NSControlTextDidChangeNotification ). أي أفكار أخرى؟

question

التعليق الأكثر فائدة

أعلم أن هذا قد تم إغلاقه لفترة طويلة ولكني وجدت حلاً لمشكلتكindragiek.
لنفترض أن لديك خاصية ، NSString* name على نموذج العرض الخاص بك.
في وحدة التحكم الخاصة بك ، عند ربط حقل النص بنموذج العرض والعكس ، قم بما يلي:
[[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"/> }];`

بهذه الطريقة تقوم بالكشف كلما انطلقت إشارة النص وللتغييرات البرمجية لخاصية النص.

ال 8 كومينتر

التناسق مع AppKit هنا هو ميزة وليس خطأ. سيكون من الغريب ، IMO ، أن تنطلق مقابل rac_textSignal لأحداث لا يمكن ملاحظتها تقليديًا.

هذا ليس منطقيًا دائمًا ، ولكن بشكل عام يجب اعتبار الأحداث التي تنتشر في طبقة العرض "نهائية". إذا كنت بحاجة إلى ترشيحها أو تحويلها قبل هذه النقطة ، فيجب أن يتم ذلك من خلال نموذج عرض أو شيء من هذا القبيل.

ما هي حالة الاستخدام لملاحظة التغييرات البرمجية؟

مثال محدد: لدي نموذج به عدة حقول نصية وزر مسح ، والنقر فوق مسح مجموعات stringValue في كل حقل نص إلى @"" . أستخدم rac_textSignal لبعض منطق التحقق من صحة النموذج ، ولا يتم تحديث حالة التحقق عند النقر فوق مسح لأن -rac_textSignal لا يلتقط التغييرات. الحل الوحيد هو نشر NSControlTextDidChangeNotification يدويًا ، وهو أمر مروع:

فيما يتعلق بـ MVVM ، سيكون التصميم الصحيح هو إجراء التحقق من صحة النموذج _view_ ، وليس العرض. سيكون لنموذج العرض روابط ثنائية الاتجاه لحقول النص. بعد ذلك ، يمكن للزر مسح إعادة تعيين حقول نموذج العرض ، وكل شيء: بريق :.

سيكون MVC متشابهًا إلى حد ما ، فقط باستخدام وحدة تحكم أو نموذج عرض وسيط بدلاً من ذلك.

لقد فكرت في ذلك ، لكن استخدام الروابط يمثل مشكلة بحد ذاتها في حالتي الخاصة. هذا لا علاقة له بهذا السؤال ، لذلك أعتقد أنه يمكن إغلاق هذا. شكرا!

FWIW ، حتى لو كانت Cocoa Bindings ™ تمثل مشكلة ، يمكنك استخدام RACChannel لإنشاء روابط ثنائية الاتجاه لا تعتمد عليها.

أعلم أن هذا قد تم إغلاقه لفترة طويلة ولكني وجدت حلاً لمشكلتكindragiek.
لنفترض أن لديك خاصية ، NSString* name على نموذج العرض الخاص بك.
في وحدة التحكم الخاصة بك ، عند ربط حقل النص بنموذج العرض والعكس ، قم بما يلي:
[[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"/> }];`

بهذه الطريقة تقوم بالكشف كلما انطلقت إشارة النص وللتغييرات البرمجية لخاصية النص.

startupthekid شكرًا ، إنه يساعدني.

تضمين التغريدة

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

toddbluhm picture toddbluhm  ·  5تعليقات

gabro picture gabro  ·  5تعليقات

mdiep picture mdiep  ·  5تعليقات

RuiAAPeres picture RuiAAPeres  ·  3تعليقات

simonxcheng picture simonxcheng  ·  6تعليقات