الكاكاو: البرنامج المساعد لا يمكن فتح نافذة التطبيق

StackOverflow https://stackoverflow.com/questions/2408984

سؤال

أنا أقدم مكون إضافي ل 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top