2014-04-29 21 views
6

Tôi muốn ứng dụng của tôi yêu cầu xác nhận trước khi thoát, ngoại trừ khi hệ thống bị chấm dứt hoặc ngừng khởi động lại (vì khi OS X cố áp dụng bản cập nhật bảo mật vào nửa đêm, nó bị kẹt trên "Bạn có chắc không? " hộp tin nhắn).Làm thế nào để phân biệt giữa các nguyên nhân khác nhau của việc chấm dứt ứng dụng trong Cocoa?

Tôi làm cách nào để tìm thấy điều gì đã bắt đầu chấm dứt? Trong số [NSApp terminate:sender] người gửi luôn là nil. Ý tưởng đầu tiên của tôi là chỉ hỏi khi mục menu chính "Thoát" được kích hoạt, nhưng người dùng cũng có thể chấm dứt ứng dụng từ trình đơn Dock hoặc bằng cách nhấn Cmd + Q trong khi giữ Cmd + Tab và tôi muốn để yêu cầu xác nhận trong những trường hợp này.

Trả lời

2

Bạn có thể nhận được thông báo khi hệ thống sắp tắt nguồn, khởi động lại hoặc nếu người dùng chỉ đăng xuất. Đây không phải là thông báo bình thường, mà là thông báo vùng làm việc.

Bạn có thể đăng thông báo như thế này:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 
    //...more code... 

    self.powerOffRequestDate = [NSDate distantPast]; 
    NSNotificationCenter *wsnCenter = [[NSWorkspace sharedWorkspace] notificationCenter]; 
    [wsnCenter addObserver:self 
        selector:@selector(workspaceWillPowerOff:) 
         name:NSWorkspaceWillPowerOffNotification 
        object:nil]; 
} 

trong xử lý thông báo, bạn chỉ nên tiết kiệm đi ngày:

- (void)workspaceWillPowerOff:(NSNotification *)notification 
{ 
    self.powerOffRequestDate = [NSDate new]; 
} 

Thêm

@property (atomic,strong,readwrite) NSDate *powerOffRequestDate; 

đến nơi thích hợp.

khi ứng dụng của bạn được yêu cầu chấm dứt, bạn sẽ nhận được ngày đó và kiểm tra xem máy tính sắp tắt hay chưa.

if([self.powerOffRequestDate timeIntervalSinceNow] > -60*5) { 
    // shutdown immediately 
} else { 
    // ask user 
} 

tôi đã chọn một intervall của 5 phút đối với trường hợp cạnh sau đây: Máy tính nên tắt nguồn, nhưng ứng dụng khác hủy bỏ đó. Ứng dụng của bạn vẫn đang chạy. 10 phút sau, người dùng đóng ứng dụng của bạn. Trong trường hợp đó, ứng dụng phải hỏi người dùng. Đây là một chút của một hack, nhưng nó không phải là một "điên hack" Tôi nghĩ rằng ...

Hy vọng điều này sẽ giúp.

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