2010-08-18 25 views
7

Tôi đã thử – windowDidExpose: nhưng nó không hoạt động. Tôi phải làm gì để thử điều này?Làm cách nào để theo dõi sự kiện mở và đóng của NSWindow?

Cửa sổ của tôi là cửa sổ tiện ích.

- chỉnh sửa cho rõ ràng hơn -

Những gì tôi muốn là:

viewWillAppear viewWillDisappear viewDidLoad viewDidUnload

trong Cocoa Touch.

+1

'windowDidExpose: 'là cho một cửa sổ đã được sắp xếp trong đang được tiết lộ bởi các cửa sổ khác b eing ra lệnh cho nó. –

+0

Oh cảm ơn vì đã làm rõ. Thật khó để biết chỉ với mô tả trong tài liệu tham khảo. – Eonil

+0

Mô tả tốt hơn cho thông báo rằng phương thức đó tương ứng với: http://developer.apple.com/mac/library/documentation/Cocoa/Reference/ApplicationKit/Classes/NSWindow_Class/Reference/Reference.html#//apple_ref/ c/data/NSWindowDidExposeNotification –

Trả lời

4

windowDidClose:, nhưng điều đó có lẽ chỉ đề cập đến việc đóng; nếu bạn đang gửi cửa sổ của mình một thông báo orderOut:, tôi không nghĩ rằng số lượng đó sẽ bị tính. Bạn có thể cần phải chỉ theo dõi nó từ bất kỳ mã nào bạn đang đặt hàng cửa sổ vào và ra khỏi, hoặc phân lớp các phương thức lớp và ghi đè của cửa sổ như makeKeyAndOrderFront:orderOut: (bất cứ điều gì bạn đang sử dụng, ít nhất) để đăng thông báo tùy chỉnh trước khi gọi tới super.

+0

Không có thông báo ủy nhiệm cho điều này? Thật khó để tin! Có vẻ như không phải là một ý tưởng tốt về phân lớp và ghi đè tất cả các phương thức liên quan bởi vì tôi không thể chắc chắn phương pháp nào cần được ghi đè cho điều này ... – Eonil

+0

Do đó đề xuất đầu tiên: Theo dõi nó từ bất kỳ mã nào của bạn. . Cách duy nhất nó có thể đặt ra không phải bằng tay của bạn sẽ là người dùng đóng nó, và có 'windowDidClose:' cho điều đó. –

+0

OK, tôi hiểu. Cảm ơn một lần nữa! – Eonil

0

Tôi đã tìm ra một bản hack để giải quyết vấn đề này. Không có thông báo rằng tín hiệu rằng một cửa sổ đã được đặt trên màn hình, nhưng có một thông báo được đảm bảo khá nhiều để được gửi khi cửa sổ được đặt trên màn hình. Tôi đang nói về NSWindowDidUpdateNotification, cho biết cửa sổ đã tự làm mới.

Tất nhiên, nó không phải là chỉ được gửi khi cửa sổ xuất hiện — nó được gửi mỗi lần cửa sổ cập nhật. Không cần phải nói, thông báo này được gửi nhiều lần. Vì vậy, bạn muốn xem cho nó lần đầu tiên, làm điều của bạn, và bỏ qua bất kỳ thông báo tiếp theo. Trong trường hợp của tôi, tôi muốn thêm một trang tính vào một cửa sổ mà một phần khác của ứng dụng của tôi sẽ đặt hàng sau này. Vì vậy, tôi đã làm một cái gì đó như thế này:

__block id observer = [NSNotificationCenter.defaultCenter addObserverForName:NSWindowDidUpdateNotification object:window queue:nil usingBlock:^(NSNotification *note) { 
    [self showSetupSheet]; 
    [NSNotificationCenter.defaultCenter removeObserver:observer]; 
}]; 

Không có lý do đặc biệt mà bạn sẽ phải sử dụng một quan sát viên-một người quan sát phương pháp dựa trên khối dựa trên sẽ chỉ làm việc tốt.

5

Câu hỏi rất cũ, nhưng chỉ dành cho mục đích tài liệu:


Theo dõi mở: Trong điều khiển cửa sổ của bạn ghi đè phương pháp:

-(void)showWindow:(id)sender 
{ 
    //add this for track the window close 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(windowWillClose) 
               name:NSWindowWillCloseNotification 
               object:nil]; 
    [super showWindow:sender]; 
    //do here what you want... 
} 

Theo dõi chặt chẽ: Thực hiện phương thức

-(void)windowWillClose 
{ 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
    //do here what you want... 
} 
+0

Có tốt không để có một tham số 'id' cho người quan sát thông báo không? – Eonil

+0

nó không phải là sai nhưng có, nếu bạn muốn nhận được một đối tượng, ví dụ như cửa sổ gửi, bạn phải thay đổi người quan sát thông báo của bạn. – Kappe

0

Đối Swift

Theo dõi mở: Trong điều khiển cửa sổ của bạn ghi đè phương pháp:

override func showWindow(sender: AnyObject?) { 
     NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(windowWillClose), name: NSWindowWillCloseNotification, object: nil) 
    } 

Theo dõi chặt chẽ: Thực hiện phương pháp này:

func windowWillClose() -> Void { 

     NSNotificationCenter.defaultCenter().removeObserver(self); 
     //Do here what you want.. 
    } 
+0

Đối Swift 4: 'NotificationCenter.default.addObserver (tự như công cụ chọn: #selector (windowWillClose), và tên: NSWindow.willCloseNotification, đối tượng: cửa sổ) ' và ' @objc func windowWillClose() -> Void { NotificationCenter .default.removeObserver (self) // Làm ở đây những gì bạn muốn .. } ' –

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