الكاكاو: البرنامج المساعد لا يمكن فتح نافذة التطبيق
-
18-09-2019 - |
سؤال
أنا أقدم مكون إضافي ل Osirix..
في هذا التطبيق لدي 3-4 ملفات NIB. أيضا في البرنامج المساعد هناك ملفات (.h & .m) يسمى البرنامج المساعد حيث يتم استدعاء الطريقة التي يتم استدعاؤها - (طويل) filterimage: (nsstring) meduname موجود منه بدء تشغيل البرنامج المساعد. الآن مشكلتي هي أنه، لقد قمت بإرجاع التعليمات البرمجية لإطلاق النافذة الرئيسية في ملف .m آخر ويجب أن أتصل بهذا الملف باستخدام الطريقة المذكورة أعلاه.
يحتوي التطبيق على ملفات NIB متعددة. لدي اسم البرنامج المساعد البرنامج المساعد يسمى:
- (long) filterImage:(NSString*) menuName
يجب أن يفتح البرنامج المساعد نافذة عند الاتصال به بواسطة هذه الطريقة. الرمز الذي يحدد وحدة تحكم النافذة في حالة جيدة أخرى. عندما اتصل filterimage
الطريقة في البرنامج المساعد، نافذة لا تظهر أبدا.
هنا أنا filterImage:
طريقة.
#import "XGridInOsiriXFilter.h"
#import "MainWindowController.h"
@implementation XGridInOsiriXFilter
- (void) initPlugin
{
}
- (long) filterImage:(NSString*) menuName
{
MainWindowController *mainWindowController = [[GridSampleMainWindowController alloc] init];
[mainWindowController showWindow:self ];
[mainWindowController release];
return 0;
}
@end
إن استدعاء الأسلوب ينتج لا تحذيرات أو أخطاء، فإن النافذة فشلت ببساطة في الظهور.
المحلول
لن تفتح نافذة التطبيق الرئيسية للتطبيق من البرنامج المساعد. الإضافات بحكم التعريف، لا أكون دائما حاضرا حتى لا يجب أن تضع شفرة حرجة فيها. لا تريد إضافات متعددة فتح نفس النافذة المنطقية.
بدلا من ذلك، يجب عرض النافذة الرئيسية من قبل مفوض التطبيق طبيعي ولكن المحتوى من النافذة يمكن معالجتها بواسطة البرنامج المساعد إذا كان البرنامج المساعد متاحا.
يجب أن يقوم التطبيق الرئيسي بتحميل وتكوين النافذة الرئيسية واستدعاء البرنامج المساعد فقط لمعالجة محتويات النافذة.
حتى أنه من الممكن تقنيا افتح نافذة من البرنامج المساعد، لذلك إما (1) لا يتم تحميل البرنامج المساعد ولم يتم استدعاء الأسلوب (إدراج نقطة توقف / سجل للتأكيد) أو (2) وحدة تحكم النافذة خاطئة بهذا لا يفتح النافذة. اختبار وحدة التحكم خارج البرنامج المساعد لتأكيد أعمالها. الأفضل من ذلك، نقل رمز فتح النافذة خارج البرنامج المساعد.
IDIT01:
من التعليق:
لقد قمت ببعض التغييرات في التعليمات البرمجية أعلاه كما يلي
- (long) filterImage:(NSString*) menuName {
MainWindowController *mainWindowController = [[GridSampleMainWindowController alloc] init:self];
[mainWindowController showWindow:self ];
[mainWindowController release];
return 0;
}
ولكن يظهر Wanring أن الطريقة التي لم يتم العثور عليها. لماذا يظهر مثل هذه الطريقة لأن طريقة der في ملف mainwindowcontroller.m
حسنا، لديك مشكلتان هنا.
(1) قمت بتعيين تحديد mainWindowController
اعتبارا من الفصل MainWindowController
لكنك تهيئة ذلك مع الفصل GridSampleMainWindowController
. وبعد إذا MainWindowController
هي فرعية من GridSampleMainWindowController
هذا سيعمل ولكن سوف تولد تحذيرات. يجب عليك أولا تهيئة ذلك
GridSampleMainWindowController *mainWindowController = [[GridSampleMainWindowController alloc] init:self];
أو
MainWindowController *mainWindowController = [[MainWindowController alloc] init:self];
(2) يمكنك تحرير وحدة التحكم دون أي كائن آخر يحتفظ بها مما يقتله. عند وفاة وحدة تحكم النافذة التي تلصقها عناصر تحكم Windows IT. هذا على الأرجح لماذا لا ترى شيئا.
يجب عليك حل الفئة التي تريد أن تكون وحدة التحكم، ثم تعيينها كخاصية محتفية من فئة البرنامج المساعد حتى تتمكن من الاحتفاظ بها نافذة حولها.
أي init
الطريقة هي الشكوى حول؟ لك initPlugin
لا يفعل شيئا ويعود void
إذا كان هذا هو طريقة التهيئة الفعلية في البرنامج المساعد، فلن يتم تحميل البرنامج المساعد أبدا. يجب أن تبدو على الأقل مثل هذا:
- (id) initPlugin
{
self=[super init];
return self;
}
يبدو أنك تأتي من خلفية نقية ج رائعة لهذه البيئة ولكنك تحتاج إلى معرفة المزيد من الأجزاء الموجهة للكائنات من لغة الهدف. ما زلت تكتب طرق كما لو كانت مهام المدرسة القديمة، وهناك الاختلافات ذات الأوقات الفائقة.
آسف فاتني كل هذا أمس. رأيت "البرنامج المساعد" وركز على الجانب الخطأ من المشكلة.
EDIT02:
لا أنا لا أتحدث عن طريقة initPlugin الخاصة بي. أنا أتحدث عن طريقة INIT الخاصة بي الموجودة في ملف Mainwindowcontroller.m
- (id)init {
self = [super initWithWindowNibName:@"MainWindow"];
return self;
}
هذا سوف يعيد مثيل MainWindowController
الطبقة السوبر. إذا كنت لا تقوم بأي تخصيص ليس لديك حاجة لتجاوز طريقة INITE الخاصة بك في الفئة الفرعية. ما عليك سوى استخدام الإصدار الموروث
MainWindowController *mainWindowController = [[MainWindowController alloc] initWithWindowNibName:@"MainWindow"];
نصائح أخرى
أدرك أن هذا قد يأتي بعد فوات الأوان ولكن كنت أبحث عن طريقة للقيام بنفس الشيء الذي تطلبه ووجده. يمكنك استخدام NSBundle
لتحميل NIB المطلوب وأشرحها إلى وحدة تحكم مفهيا. يحب:
@implementation YourPluginFilter
- (void) initPlugin
{
yourWindowController = [[YourWindowController alloc] init];
NSLog(@"Initialized YourWindowController");
}
- (long) filterImage:(NSString*) menuName
{
if (yourWindowController && [NSBundle loadNibNamed:@"YourNibName" owner:yourWindowController]) {
NSLog(@"Activated yourWindowController");
return 0;
} else {
return -1;
}
}
@end