تعطيل/تمكين nsbutton إذا كان nstextfield فارغًا أم لا
-
03-10-2019 - |
سؤال
أنا مبتدئ مع الكاكاو. لدي زر وحقل نص في تطبيقي. أريد تعطيل الزر عندما يكون Textfield فارغًا وتمكينًا عند كتابة المستخدم شيئًا ما.
أي نقطة للبدء؟ أي "سحر" ملزمة في Builder واجهة؟
شكرًا
تحرير
لقد حاولت ضبط AppDelegate كمندوب NSTextfield وأضفت هذه الطريقة (MyTextfield و MyButton هما Iboutlets):
- (void)textDidChange:(NSNotification *)aNotification
{
if ([[myTextField stringValue]length]>0) {
[myButton setEnabled: YES];
}
else {
[myButton setEnabled: NO];
}
}
ولكن لا شيء يحدث...
المحلول
لقد حاولت ضبط AppDelegate كمندوب NSTextfield وأضفت هذه الطريقة (MyTextfield و MyButton هما Iboutlets):
- (void)textDidChange:(NSNotification *)aNotification { if ([[myTextField stringValue]length]>0) { [myButton setEnabled: YES]; } else { [myButton setEnabled: NO]; } }
هذه هي الطريقة الصعبة ، ولكن يجب أن تعمل بشكل جيد. إما أنك لم تقم بتوصيل حقل النص delegate
منفذ لهذا الكائن ، لم تقم بتوصيل myTextField
منفذ إلى حقل النص ، أو لم تقم بتوصيل myButton
منفذ للزر.
الطريقة الأخرى هي منح وحدة التحكم خاصية تعرض قيمة السلسلة ، وربط حقل النص value
ملزمة لهذا stringValue
الخاصية ، وربط الزر enabled
ربط وحدة التحكم stringValue.length
.
يمكنك أيضًا إعطاء وحدة التحكم خصائصين ، واحدة لها قيمة منطقية ، وتعيين تلك واحدة تعتمد على خاصية السلسلة ، وربط الزر بذلك. هذا حل أنظف وربما أكثر قوة ، على الرغم من أنه يعمل أكثر.
نصائح أخرى
إليك حل باستخدام الروابط.
أدناه أقوم بإعداد nstextfield ملزمة لخاصية "النص" لمالك الملف. "النص" هو NSString. لقد اشتعلت من خلال "قيمة التحديثات المستمرة". التفكير في أن الحل الخاص بي لم ينجح ، لكن في الحقيقة لم يكن يتم تحديثه كما كتب المستخدم ، وفقط عندما فقدت Textfield التركيز.
والآن قم بإعداد الارتباطات على الزر ، ما عليك سوى تعيين حالته الممكّنة على طول خاصية نص مالك الملف.
Annd ، منتج العمل.
إذا كنت تستخدم ControlTextDidChange بدلاً من TextDidChange ، فيمكنك التخلص من أشياء الإخطار والاعتماد فقط على أن تكون مندوب Nstextfield.
شكرا بيتر. ما فاتني (في الإصدار الصعبة) هو قطعة الكود هذه في Awakefromnib في AppDelegate:
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
[center addObserver:self selector:@selector(textDidChange:) name:NSControlTextDidChangeNotification object:myTextField];
إنه يعمل بشكل مثالي. الآن أنا أحاول الطريق السهل ، لكنني أخشى أنني لا أزال جيدًا بما يكفي مع الروابط.
لربط العقار
@property (retain) IBOutlet NSString *aStringValue;
مع قيمة TextField ، ما يجب علي استخدامه في IB لـ "Bind to:" و "مفتاح التحكم" و "مسار مفتاح النموذج"؟