سؤال

أنا مبتدئ مع الكاكاو. لدي زر وحقل نص في تطبيقي. أريد تعطيل الزر عندما يكون 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 التركيز.

Binding the NSTextField to the file's owner NSString text property

والآن قم بإعداد الارتباطات على الزر ، ما عليك سوى تعيين حالته الممكّنة على طول خاصية نص مالك الملف.

Binding the NSButton's enabled state to the text property's length

Annd ، منتج العمل.

enter image description here enter image description here

إذا كنت تستخدم 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:" و "مفتاح التحكم" و "مسار مفتاح النموذج"؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top