سؤال

أحاول إنشاء نافذة برمجية مع العرف contentView وواحد مخصص NSTextField السيطرة، لكنني أواجه مشكلة في الحصول على هذا التسلسل الهرمي للنافذة والآراء لرسم أنفسهم.

أقوم بإنشاء نافذة عرفة بلا حدود وتجاوزها setContentView / contentView مسافر. يبدو أن هذا يعمل بشكل جيد ومخصص initWithFrame و drawRect تسمى الأساليب التسبب في قيام ContentView في رسم نفسه بشكل صحيح.

ولكن بمجرد أن أحاول إضافة مخصص برمجيا NSTextField ل contentView لا يتم إضافة أو رسمها. بقولها مخصص أقصد أن أتجاوز تهيئة المعينة (initWithFrame:frame - فقط لإعداد الخط المخصص) وطريقة ورصة تبدو وكأنها هذه:

- (void)drawRect:(NSRect)rect {
    NSRect bounds = [self bounds];
    [super drawRect:bounds];
}

يشبه تهيئة Custom ContentView الهتكي:

- (id)initWithFrame:(NSRect)frame {
    self = [super initWithFrame:frame];
    if (self != nil) {
      // i want to draw itself to the same 
      // size as contentView thus i'm using same frame
      CustomTextField *textField = [[CustomTextField alloc] initWithFrame:frame];
      [self addSubview:textField];
      [self setNeedsDisplay:YES];
    }
    return self;
}

لقد كنت أبحر مع هذا لساعات قليلة، لذا فإن أي مؤشرات موضع تقدير كبير. مزيد من الكود متاح عند الطلب.)

هل كانت مفيدة؟

المحلول 2

شكرا لإجاباتك!

لقد وجدت مشكلتي الخاصة. السبب وراء عدم استدعاء ورشة الانتشار هو أن TextField مخصص تم رسمها الخارج إطار عرض المحتوى. أعتقد أن نسيت أن أذكر التفاصيل الحاسمة التي أرسم فيها النافذة التي تركز على الشاشة، وبالتالي كان الإطار مع إزاحة x / y.

لملء النافذة مع عرض المحتوى الخاص به i init contentView مع نفس الإطار كنافذة (وهذا يعني نفس (x؛ y) إزاحة من نقطة النافذة (0؛ 0).

الآن أنا غير قادر فقط على الكتابة إلى حقل نص مخصص، لكن هذه مشكلة أخرى أعتقد أنني قادر على التعامل معها.

نصائح أخرى

الخاص بك -drawRect: يبدو التجاوز خاطئا بالنسبة لي، لماذا تجاهل عمدا مرت وسيطة مستقلة؟ لماذا هذا ضروري؟

أما لماذا لا تظهر حقل النص، فمن المرجح أن تكون قد قمت بتكوينها. عند إنشاء رمز nstextfield، لا تحصل على نفس الشيء مثل المثيل الافتراضي الذي تحصل عليه عند سحب حقل نصي على طريقة عرض في IB. ستحتاج إلى تكوين nstextfield و nstextfieldcell للحصول على المظهر الذي تريده.

أنا أستخدم حقل نص إضافي برمجيا قمت بتكوينه مثل هذا:

_textField = [[NSTextField alloc] initWithFrame:textFieldRect];
[[_textField cell] setControlSize:NSSmallControlSize];
[_textField setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]];
[_textField setBezelStyle:NSTextFieldSquareBezel];
[_textField setDrawsBackground:YES];
[_textField setBordered:YES];
[_textField setImportsGraphics:NO];
[_textField setAllowsEditingTextAttributes:NO];
[_textField setBezeled:YES];
[_textField sizeToFit];
[self addSubview:_textField];
[_textField setFrame:textFieldRect];
[_textField setAutoresizingMask:NSViewMinXMargin];
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top