إذا قمت بتعيين نص على NSTextField
برمجيًا عبر -setStringValue:
أو -setAttributedStringValue:
، فلن يؤدي هذا إلى تشغيل NSControlTextDidChangeNotification
، مما يعني أن -rac_textSignal
فاز لا تلتقط التغيير أيضا. إنه يعمل فقط عندما يتم تحرير النص من خلال تفاعل المستخدم.
سيكون الحل السهل هو استخدام -rac_signalForSelector:
لاعتراض المكالمات إلى المستوطنين أيضًا (بالإضافة إلى التسجيل مقابل NSControlTextDidChangeNotification
). أي أفكار أخرى؟
التناسق مع 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 شكرًا ، إنه يساعدني.
تضمين التغريدة
التعليق الأكثر فائدة
أعلم أن هذا قد تم إغلاقه لفترة طويلة ولكني وجدت حلاً لمشكلتك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"/> }];`
بهذه الطريقة تقوم بالكشف كلما انطلقت إشارة النص وللتغييرات البرمجية لخاصية النص.