سؤال

أنا أستخدم هذا الرمز:

    NSOpenPanel *openPanel = [NSOpenPanel openPanel];
    [openPanel beginForDirectory:nil file:nil types:[NSImage imageFileTypes] modelessDelegate:self didEndSelector:NULL contextInfo:NULL];

هذا هو الكود الوحيد في الطريقة. عند استدعاء الطريقة، تظهر اللوحة المفتوحة على الشاشة لمدة ثانية تختفي. كيف يمكنني منع هذا؟

شكرا.

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

المحلول

نظرا لأن الفريق غير محظور، يستمر تنفيذ التعليمات البرمجية بمجرد فتح اللوحة. يتم إلغاء تخصيص اللوحة المفتوحة لأنك لا تحتفظ بالرجوع إليها في مكان ما. -openPanel هو منشئ راحة وإرجاع كائن التشغيل التلقائي الذي سيذهب بعيدا عند برزت تجمع Autorelease الحالي أو (في تطبيق GC) عند تشغيل المجمع التالي. في حالتك، هذا بمجرد انتهاء طريقتك.

إذا كنت تريد الالتزام باللوحة، فيجب عليك الاحتفاظ به على وجه التحديد باستخدام -retain, ، ثم بعد ذلك -release ذلك في doledselector:

- (void)showPanel
{
    NSOpenPanel *openPanel = [[NSOpenPanel openPanel] retain]; //note the retain
    [openPanel beginForDirectory:nil 
                            file:nil 
                           types:[NSImage imageFileTypes] 
                modelessDelegate:self 
                  didEndSelector:@selector(myOpenPanelDidEnd:returnCode:contextInfo:)
                     contextInfo:NULL];
}

- (void)myOpenPanelDidEnd:(NSOpenPanel *)panel returnCode:(int)returnCode contextInfo:(void*)contextInfo
{
    NSArray* fileNames = [panel filenames];
    [panel release];
    //do something with fileNames
}

إذا كنت تستخدم مجموعة القمامة، والاحتفاظ بها والإفراج عنها هي عدم العمليات، لذلك يجب عليك تخزين مرجع قوي إلى NSOpenPanel, ، مثل تخزينها في متغير مثيل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top