2012-08-19 36 views
5

Tôi gặp vấn đề khi nghe các sự kiện, tôi có thể nghe các sự kiện hoạt động hoàn hảo tuy nhiên tôi không thể dừng nghe các sự kiện. Tôi đã nghiên cứu nó một lúc và nghĩ ra một phương pháp, + (void) removeMonitor: (id) eventMonitor, mà nó nói rằng tôi nên sử dụng khi tôi thực hiện với người ngheLàm thế nào để ngừng nghe NSEvents?

Nhưng khi tôi cố gắng sử dụng phương pháp, như vậy

[NSEvent addGlobalMonitorForEventsMatchingMask:(NSLeftMouseDownMask|NSKeyDownMask) handler:^(NSEvent *event) { 
    [NSEvent removeMonitor:event]; 
}]; 

tôi tiếp tục nhận được một lỗi của "- [NSEvent làm mất hiệu lực]: chọn không được công nhận gửi đến dụ" mà tôi nghiên cứu là tốt, và tôi tin rằng nó có nghĩa là tôi đang ghi đè lên một ký ức đó là đang được sử dụng. Tuy nhiên tôi không biết làm thế nào để giải quyết vấn đề này. Bất kỳ đề nghị, hoặc giúp đỡ được đánh giá rất nhiều!

CẬP NHẬT Nhờ JWWalker, Samir và Abizern, bây giờ nó hoạt động

//I made a global variable called eventHAndler 

tập tin .h

id eventHAndler 

tập tin .m

eventHAndler = [NSEvent addGlobalMonitorForEventsMatchingMask:(NSLeftMouseDownMask|NSKeyDownMask) handler:^(NSEvent *event){ 
///code 
}]; 

/// created another method called stop. When called it stops the eventHAndler 
- (IBAction)Stop:(id)sender 
{ 
    stop = 1; 
    NSLog(@"inside stop method"); 
    [NSEvent removeMonitor:eventHAndler]; 
} 

Trả lời

11

Bạn đang đi qua những điều sai trái để removeMonitor:. Cuộc gọi đến +[NSEvent addGlobalMonitorForEventsMatchingMask: handler:] trả về một giá trị được gọi là đối tượng xử lý sự kiện. Đó là những gì có thể được chuyển đến removeMonitor:.

+0

Tôi xin lỗi tôi vẫn còn bối rối. Làm thế nào để tôi nhận được giá trị trả về cho + [NSEvent addGlobalMonitorForEventsMatchingMask: handler:^(sự kiện NSEvent *)]? –

+0

@ A.sharif, nếu bạn có nghĩa là làm thế nào để bạn nhận được nó trong khối xử lý sự kiện, sau đó thẳng thắn tôi không biết, tôi đã không bao giờ được sử dụng khối. – JWWalker

+1

JWWalker là đúng. Một cái gì đó như: id eventHAndler = [NSEvent addGlobalMonitorForEventsMatchingMask: handler:]; .... [NSEvent removeHandler: eventHAndler] Đảm bảo rằng bạn chỉ gỡ bỏ trình xử lý một lần, nếu không bạn có thể gặp phải vấn đề về bộ nhớ. – Samir

0

Theo: http://developer.apple.com/library/mac/#documentation/cocoa/conceptual/EventOverview/MonitoringEvents/MonitoringEvents.html

T này nói:

Trình giám sát sự kiện toàn cầu tìm kiếm sự kiện nhập người dùng được gửi đến các ứng dụng khác với sự kiện được cài đặt. Màn hình không thể sửa đổi sự kiện hoặc ngăn phân phối bình thường của sự kiện. Và nó chỉ có thể các sự kiện quan trọng của màn hình nếu khả năng truy cập được bật hoặc nếu ứng dụng được tin cậy để truy cập.

Vì vậy, nó không thể nói người đàn ông mình: P

+0

Tôi không cố dừng hành động này. Tôi đang cố ngừng nghe nó. Về cơ bản vấn đề của tôi là, chương trình của tôi đi vào một vòng lặp mà chỉ cần lắng nghe. Tôi muốn rời khỏi vòng lặp đó. Nhận xét bạn trích dẫn đang nói về việc thay đổi nội dung người dùng nhập vào, đó không phải là những gì tôi đang cố gắng thực hiện. –

+0

Nếu bạn chỉ muốn dừng nghe nó tại sao không chỉ sử dụng một BOOL đơn giản hoặc một cái gì đó tương tự và kiểm tra xem nó có hay không, và làm những gì thích hợp. –

+0

Tôi không thể thoát khỏi vòng lặp với câu trả lời hoặc câu lệnh ngắt, vì vậy câu lệnh Boolean sẽ không giúp tôi trừ khi tôi biết cách thoát khỏi vòng lặp. –

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