هل يمكن استخدام Nsalert لإنشاء نافذة عائمة؟
سؤال
لدي تطبيق الكاكاو يعرض تنبيه مشروط التطبيق باستخدام 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];
}
يهدف هذا إلى جعله يتصرف مثل تنبيه، إلا أنه يطفو أيضا، وليس مشروطا، لذلك يمكن تحديد عناصر القائمة أثناء الأمر.
هل هناك أي شيء آخر يجب فعله؟