ارتدى لا يتم استدعاءه
-
18-09-2019 - |
سؤال
أحاول إنشاء نافذة برمجية مع العرف 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];