هل يمكن استخدام Nsalert لإنشاء نافذة عائمة؟

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

  •  12-09-2019
  •  | 
  •  

سؤال

لدي تطبيق الكاكاو يعرض تنبيه مشروط التطبيق باستخدام NSAlert صف دراسي. أرغب في تعويم نافذة التنبيه فوق جميع تطبيقات التطبيقات الأخرى. هل يمكن القيام بذلك NSAlert, ، أو هل أحتاج إلى تنفيذ نافذتي الخاصة؟

لا أعرف ما إذا كان أي من هذه الأمور، ولكن التطبيق هو تطبيق وكيل (LSUIElement صحيح) تنفيذ ك NSStatusItem. وبعد (لمزيد من المعلومات حول التطبيق، بما في ذلك شفرة المصدر، انظر u003Chere>.)

هنا هو الرمز الذي يعرض التنبيه:

- (void)showTimerExpiredAlert {
    [NSApp activateIgnoringOtherApps:YES];

    NSAlert *alert = [[NSAlert alloc] init];
    [alert setAlertStyle:NSInformationalAlertStyle];
    [alert setMessageText:NSLocalizedString(@"Menubar Countdown Complete", @"Expiration message")];
    [alert setInformativeText:NSLocalizedString(@"The countdown timer has reached 00:00:00.",
                                                @"Expiration information")];
    [alert addButtonWithTitle:NSLocalizedString(@"OK", @"OK button title")];
    [alert addButtonWithTitle:NSLocalizedString(@"Restart Countdown...", @"Restart button title")];

    NSInteger clickedButton = [alert runModal];
    [alert release];

    if (clickedButton == NSAlertSecondButtonReturn) {
        // ...
    }
}

لقد حاولت وضع هذا قبل runModal يتصل:

[[alert window] setFloatingPanel:YES];

لقد حاولت أيضا هذا:

[[alert window] setLevel:NSFloatingWindowLevel];

لكن أيا من تلك التي تجعل النافذة تبقى فوق الآخرين إذا قمت بالنقر فوق نافذة تطبيق أخرى. أظن runModal فقط لا تحترم أي من هذه الإعدادات.

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

المحلول

لقد حطمت ذهني حول هذا الشيء بالضبط منذ فترة.

الطريقة الوحيدة التي يمكنني بها الحصول على هذا للعمل (نوع)، كانت فرعية NSAPPlication، وتجاوز -Sendevent. في -Sendevent، ستدعو أولا إلى تنفيذ السوبر، ثم افعل شيئا مثل هذا:

id *modalWindow = [self modalWindow];
if (modalWindow && [modalWindow level] != MY_DESIRED_MODAL_WINDOW_LEVEL)
    [modalWindow setLevel: MY_DESIRED_MODAL_WINDOW_LEVEL];

بصرف النظر عن ذلك حتى هذا لم ينجح طهارة للغاية - عند تبديل التطبيقات - لن ترغب في القيام بذلك على أي حال لأنها خانق ومختر.

نعم، للأسف، أنت أفضل حالتك في كتابة نسختك الخاصة من NSALERT. إذا كنت تهتم حقا بهذه الاحتمال، فسأكدم خطأ على ذلك. من الغريب جدا أن [[نافذة التنبيه] Setlevel: Somelevel] لا يتم تكريمه بواسطة NSAPPlication وهو مضيعة لإعادة إنشاء NSALERT مع كل ميزات تخطيط تلقائي صغير أنيق فقط لتكون قادرة على القيام بذلك.

نصائح أخرى

ما انتهى به الأمر كان يتخل NSAlert وبدلا من ذلك أحمل NSWindow من بنك الاستثمار القومي.

هنا هو الرمز الذي يعرض النافذة:

- (void)showAlert {
    NSWindow *w = [self window];
    [w makeFirstResponder:nil];
    [w setLevel:NSFloatingWindowLevel];
    [w center];
    [w makeKeyAndOrderFront:self];
}

يهدف هذا إلى جعله يتصرف مثل تنبيه، إلا أنه يطفو أيضا، وليس مشروطا، لذلك يمكن تحديد عناصر القائمة أثناء الأمر.

هل هناك أي شيء آخر يجب فعله؟

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