2009-04-19 38 views
8

Tôi có một ứng dụng Cocoa hiển thị cảnh báo kiểu ứng dụng bằng cách sử dụng lớp NSAlert. Tôi muốn cửa sổ cảnh báo trôi nổi trên tất cả các cửa sổ ứng dụng khác. Điều này có thể được thực hiện với NSAlert hoặc tôi có cần triển khai cửa sổ của riêng mình không?NSAlert có thể được sử dụng để tạo cửa sổ nổi không?

Tôi không biết có bất kỳ vấn đề nào trong số này không, nhưng đơn đăng ký là đơn đăng ký đại lý (LSUIElement là đúng) được triển khai dưới dạng NSStatusItem. (Để biết thêm về các ứng dụng, bao gồm cả mã nguồn, nhìn <here>.)

Dưới đây là đoạn code mà sẽ hiển thị cảnh báo:

- (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) { 
     // ... 
    } 
} 

Tôi đã thử đặt này trước khi runModal gọi:

[[alert window] setFloatingPanel:YES]; 

tôi cũng đã thử điều này:

[[alert window] setLevel:NSFloatingWindowLevel]; 

Nhưng neit cô ấy của những người làm cho cửa sổ ở trên những người khác nếu tôi nhấp vào cửa sổ của ứng dụng khác. Tôi nghi ngờ runModal chỉ không tôn trọng một trong các cài đặt đó.

+1

bất cứ khi nào runModal được gọi là nó đặt lại mức cửa sổ, không chắc chắn nếu điều đó giúp ... – cobbal

Trả lời

5

Tôi đã phá hỏng bộ não của mình về chính xác điều này một thời gian trước đây.

Cách duy nhất để tôi có thể làm việc này (sắp xếp), là phân lớp NSApplication và ghi đè -sendEvent. Trong -sendEvent, trước tiên bạn muốn gọi thực hiện siêu, sau đó làm một cái gì đó như thế này:

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

Ngoài ra ngay cả điều này đã không làm việc khá spotlessly - khi chuyển đổi các ứng dụng - bạn không bao giờ muốn làm điều này anyway bởi vì nó là một vụ tấn công thô lỗ, thô lỗ.

Vì vậy, thật đáng buồn, bạn nên viết phiên bản NSAlert của riêng mình. Nếu bạn thực sự quan tâm đến khả năng này, tôi sẽ gửi một lỗi trên đó. Thật kỳ lạ khi [[cửa sổ cảnh báo] setLevel: someLevel] không được NSApplication vinh danh và thật lãng phí khi phải xây dựng lại NSAlert với tất cả các tính năng bố cục tự động nhỏ gọn của nó chỉ để có thể thực hiện điều này.

2

Điều tôi đã làm cuối cùng là từ bỏ NSAlert và thay vào đó tôi tải một cảnh báo NSWindow cảnh báo từ một NIB.

Đây là đoạn mã để hiển thị cửa sổ:

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

này được thiết kế để làm cho nó hoạt động như một cảnh báo, ngoại trừ việc nó cũng nổi, và nó không phải là phương thức, vì vậy các mục menu có thể được chọn trong khi nó lên.

Có điều gì khác tôi nên làm không?

Các vấn đề liên quan