2015-06-09 16 views
6

Tôi đang cố gắng tạo một ứng dụng cho OS X bằng Swift và Cocoa. Tôi muốn ứng dụng phản hồi các sự kiện chính mà không tập trung vào/trong trường văn bản. Tôi tạo ra một dự án ca cao mới với cốt truyện trong Xcode, và đã sửa đổi lớp ViewController.swift như sau:Swift NSViewController đáp ứng với sự kiện mouseDown, nhưng không phải sự kiện KeyDown

import Cocoa 

class ViewController: NSViewController { 

    override func mouseDown(theEvent: NSEvent) { 
     println("Mouse Clicked") 
    } 

    override func keyDown(theEvent: NSEvent) { 
     println("Key Pressed") 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 

    override var representedObject: AnyObject? { 
     didSet { 
     } 
    } 

} 

Khi tôi chạy chương trình, tôi nhận được giao diện điều khiển đầu ra khi tôi bấm vào cửa sổ, nhưng tôi don không nhận được bất kỳ đầu ra giao diện điều khiển nào khi tôi nhấn bất kỳ phím nào.

Vì vậy, câu hỏi của tôi là: Tại sao chương trình của tôi phản hồi sự kiện chuột chứ không phải các sự kiện chính? Tôi cần phải thực hiện thêm các bước nào để thực hiện các sự kiện quan trọng khi các sự kiện chuột thực hiện?

Dường như bộ điều khiển chế độ xem của tôi nằm trong chuỗi phản hồi vì nó chặn các sự kiện chuột, do đó dường như không phải vấn đề. Tôi đã tìm thấy câu trả lời khác trên đây trên SE nói rằng tôi cần phải phân lớp NSView hoặc lớp NSWindow. Có thể nhận các sự kiện quan trọng mà không làm điều đó không?

Xin cảm ơn trước.

EDIT: Ngoài câu trả lời được chấp nhận, Swift - Capture keydown from NSViewController là giải pháp tuyệt vời, rõ ràng.

+0

bạn có thể vui lòng cung cấp mã của mình cho phân lớp NSView không? Tôi cần phải làm điều tương tự như tôi tin. Tôi đang cố gắng để có được các phím mũi tên khi nhấn. – justColbs

+1

Câu trả lời hay nhất cho câu hỏi này là ở đây: http://stackoverflow.com/questions/32446978/swift-capture-keydown-from-nsviewcontroller/32447474 Tôi đăng bài này bởi vì không có ví dụ nào được đưa ra thực sự giúp tôi và tôi có một câu trả lời thực sự đơn giản trong bài viết ở trên đã hoạt động, ngay cả trong Xcode 8 và Swift 3. – jvarela

+0

@jvarela Đó là một liên kết tốt. Cảm ơn. Tôi sẽ cập nhật câu hỏi của mình để liên kết với nó. – Bernem

Trả lời

7

Sự khác biệt mà bạn quan sát bắt nguồn từ thực tế là Cocoa xử lý sự kiện chuột và sự kiện bàn phím hơi khác nhau. Trong giai đoạn đầu của quá trình điều phối sự kiện, tất cả các sự kiện được gửi đến đối tượng NSWindow theo hệ thống. Đối với sự kiện chuột, NSWindow chuyển tiếp chúng đến chế độ xem mà người dùng đã nhấp vào; cho các sự kiện bàn phím, NSWindow sẽ chuyển tiếp chúng đến phản hồi đầu tiên của cửa sổ khóa hiện tại.

Phản hồi đầu tiên ban đầu của một NSWindow là chính cửa sổ. Khi người dùng nhấp vào một số điện thoại NSView, NSWindow sẽ thử để làm cho chế độ xem đó trở thành trả lời đầu tiên bằng cách gửi thông báo acceptsFirstResponder. Nếu nó trả về YES, chế độ xem được nhấp sẽ trở thành trả lời đầu tiên. Tuy nhiên,

"Bí quyết" là acceptsFirstResponder trả lại NO theo mặc định. Như một đồng bằng NSView sẽ không trở thành trả lời đầu tiên, nó sẽ không nhận được sự kiện bàn phím. Vì vậy, giải pháp dễ nhất là phân lớp số NSView của bạn, ghi đè acceptsFirstResponder để trả lại YES.

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