2009-07-17 25 views
5

Tôi đang học cách xây dựng chương trình với Cocoa. Tôi đang sử dụng ứng dụng Apple mẫu có ghi video từ webcam. Tôi muốn bắt đầu và dừng video bằng cách chụp bấm phím. Tôi đã cố gắng để ghi đè lên sự kiện keydown nhưng tôi đã đọc rằng nó không thể trong một NSObject. Làm thế nào tôi có thể xử lý loại sự kiện này?KeyDown và Cocoa Sample

Lớp ứng dụng mở rộng lớp NSObject.

Đây là mã:

- (void)keyDown:(NSEvent *)event { 
    NSLog(@"Hi there"); 
    NSString *characters = [event characters]; 
    if ([characters length]) { 
    switch ([characters characterAtIndex:0]) { 
     case NSUpArrowFunctionKey: 
     NSLog(@"Key UP"); 
     break; 
    } 
    } 
} 

Trả lời

7

Tôi đã cố gắng để ghi đè sự kiện KeyDown nhưng tôi đã đọc mà Đó là không thể trong một NSObject.

Đúng. Chỉ một người trả lời mới có thể trả lời các sự kiện.

Tôi làm cách nào để xử lý loại sự kiện này?

Thực hiện trả lời tự động. Subclassing NSWindow hoặc NSWindowController sẽ hoạt động. Hãy chắc chắn rằng bạn làm cho cửa sổ hoặc cửa sổ điều khiển thực tế của bạn một thể hiện của lớp con của bạn.

Tài liệu về Cocoa giải thích thêm.

Lớp ứng dụng mở rộng lớp NSObject.

Tại sao? Thông thường, lớp chính của gói ứng dụng là NSApplication hoặc một lớp con của nó — và không có nhiều lý do chính đáng để phân lớp NSApplication.

PS: Một cuốn sách hay để bắt đầu học lập trình MacOS là gì?

Tôi không học theo cuốn sách Hillegass, bản thân tôi (tôi bị kẹt với tài liệu của Apple), nhưng đó là một đề xuất rất phổ biến và tôi đã đọc nó và có thể cho bạn biết nó tốt.

+1

Hãy cẩn thận với bộ điều khiển cửa sổ, nếu có, là bộ đáp ứng cuối cùng cho các thông báo sự kiện. Các đại biểu chỉ nhận được tin nhắn hành động, chứ không phải tin nhắn sự kiện. – IlDan

+0

Bắt tốt. Tôi sẽ chỉnh sửa câu trả lời của mình để không yêu cầu rằng ủy quyền cửa sổ sẽ hoạt động. –

4

Từ Cocoa Event-Handling Guide - The Responder Chain:

Chuỗi trả lời là một loạt liên kết của các đối tượng trả lời khi mà một sự kiện hoặc hành động nhắn được áp dụng. Khi một đối tượng trả lời cụ thể không xử lý một thông điệp cụ thể, đối tượng chuyển thông điệp tới người kế nhiệm của nó trong chuỗi (tức là, phần trả lời tiếp theo của nó).

Khi bạn nhấn một phím, cửa sổ sẽ nhận được sự kiện phím. Sau đó, nó sẽ gửi sự kiện đến phản hồi đầu tiên, thường là điều khiển với khung bezel màu xanh xung quanh đường viền của nó (cố gắng nhấp vào trường địa chỉ trong Safari hoặc Firefox, khi được gắn màu xanh, sau đó nó có trạng thái trả lời đầu tiên) .

Nếu trả lời đầu tiên không ăn bấm phím (trường địa chỉ Safari không ăn nó khi nó sẽ hiển thị một nhân vật) sau đó nó sẽ chuyển xuống chuỗi responder đến trả lời tiếp theo trong hệ thống phân cấp xem, sau đó đến cửa sổ và đến bộ điều khiển cửa sổ như bạn có thể thấy trong Guide.(Hãy cẩn thận rằng hành động phản hồi là một câu chuyện khác.)

Vì vậy, bạn phải triển khai keyDown: trên chế độ xem cửa sổ hoặc trong chính cửa sổ, nếu không có chế độ xem ăn các sự kiện. Cách đơn giản nhất để kiểm tra là ghi đè lên phương thức keyDown: của một cửa sổ trống

Để đặt tay bạn vào các hoạt động bên trong, bạn thậm chí có thể thử ghi đè phương thức sendEvent: một cửa sổ. sendEvent: gửi các sự kiện tới các khung nhìn của cửa sổ, và từ đó bạn có thể ghi lại tất cả các sự kiện được quản lý bởi cửa sổ.

4

Phân lớp NSWindow hoặc NSWindowController sẽ hoạt động.

Tương tự, bạn có thể phân lớp NSView và ghi đè phương thức xử lý sự kiện của nó.

Một cuốn sách hay để bắt đầu học Lập trình MacOS là gì?

Learn Objective-C on the Mac bởi Dalrymple thực sự đơn giản, bao gồm đủ thông tin cơ bản và di chuyển đủ nhanh để giúp bạn thoát khỏi mặt đất trong một thời gian ngắn. Nó chạm vào tất cả mọi thứ từ Xcode và Interface Builder để thực hành OOP và Objective-C. Đặc biệt hữu ích cho người mới bắt đầu (IMHO) là tổ chức tập tin nguồn và chương chương trình nền tảng.

Chúc bạn may mắn!

+0

"Hãy chắc chắn rằng bạn làm cho cửa sổ hoặc cửa sổ điều khiển thực tế của bạn một thể hiện của lớp con của bạn." Một lời cảm ơn Peter. Điều này đã giúp trên một chủ đề khác: http://stackoverflow.com/questions/1854112/keyup-event-heard-overridden-nsview-method –

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