باستخدام NSFontPanel في الكاكاو
-
06-07-2019 - |
سؤال
وأنا أحاول أن استخدام NSFontPanel للسماح للمستخدم لتغيير بيئة الخط على نطاق التطبيق. ومن المفترض أن يعمل شيئا من هذا القبيل: قيام المستخدم بالنقر فوق الزر، لوحة الخط للملوثات العضوية الثابتة، واختيار الخط والحجم، واستمر اختيارهم
والتعليمة البرمجية التالية تعرض اللوحة:
- (IBAction)showFontMenu:(id)sender {
NSFontManager *fontManager = [NSFontManager sharedFontManager];
[fontManager setDelegate:self];
NSFontPanel *fontPanel = [fontManager fontPanel:YES];
[fontPanel makeKeyAndOrderFront:sender];
}
وثائق ويبدو أن تشير إلى أن changeFont: ينبغي أن تسمى (معرف) طريقة المرسل عند تغيير الخط. هذا لا يحدث في حالتي.
- (void)changeFont:(id)sender {
// blah
}
وأي أفكار حول ما يمكن أن تقوم به خطأ؟
المحلول
والكائن التي قمت بتحديدها -changeFont:
على يجب على المستجيب الأول أو فوقه في سلسلة الرد. لم تقم بتحديد حيث قمت تعريف الأسلوب، ولكن أفترض انها على كائن تحكم غير موجود في سلسلة الرد.
نصائح أخرى
وتشمل هذه:
[fontManager setTarget:self];
ومندوب NSFontManager
وجود في المقام الأول لتصفية الخطوط التي يقدمها إلى لوحة الخط عبر -fontManager:willIncludeFont:
.
وكما kperryua يذكر، يتم إرسال -changeFont:
في سلسلة الرد. الزر الذي يطلق القائمة الخط أو عرض إرفاق لها قد يكون مكانا جيدا لوضع المستجيب ل-changeFont:
.
وقد تجد الخط مناولة أ > دليل هامشي أكثر فائدة من rel="nofollow لوحة الخط أ > الدليل.
والمشكلة الأساسية هي هذا السطر:
[fontPanel makeKeyAndOrderFront:sender];
ومن خلال جعل لوحة الخط النافذة الرئيسية، وانها حصلت على أي فكرة عن مكان لإرسال رسائل العمل مثل -changeFont: ل
وهنا هو تنفيذ عملي. النقطة الأساسية هي يجب عليك ان تجعل وجوه الخاص بك كما المستجيب الأول حيث كنت قد نفذت - (void)changeFont:(id)sender
NSFontManager *fontManager = [NSFontManager sharedFontManager];
NSFontPanel *panel = [fontManager fontPanel:YES];
[[self window] makeFirstResponder:self];
[panel orderFront:self];
وبسيط changeFont: تنفيذ المرجعي - التعامل مع الخط
-(void) changeFont:(id)sender
{
//Here sender would be NSFontManager
NSFont *oldFont = [self font];
NSFont *newFont = [sender convertFont:oldFont];
[self setFont:newFont];
}