2009-02-28 20 views
31

Hãy để tôi tóm tắt điều này ngay lập tức: "Trả lời đầu tiên" trong một tệp nib là một đối tượng, đại diện cho phần tử điều khiển giao diện người dùng có tiêu điểm của người dùng. Vì vậy, nếu người dùng nhấp vào một điều khiển, nib đặt điều khiển giao diện người dùng được nhấp là Trả lời đầu tiên. Trong ứng dụng của tôi, tôi có thể tạo một lối thoát cho "Responder đầu tiên" từ ngòi bút, để tôi có thể gửi một thông điệp "tạo màu chữ đỏ" cho bất kỳ điều gì người dùng đã kích hoạt bằng cách nhấp vào. Sau đó, nếu điều khiển UI Responder đầu tiên này không hiểu được thông báo đó, thông điệp sẽ được truyền đi trong chuỗi trả lời, cho đến khi phần tử điều khiển giao diện người dùng hoặc yếu tố cha mẹ (và vân vân) hiểu được thông báo. Nếu không, nó sẽ bị bỏ qua."Câu trả lời đầu tiên" - Tôi có nhận được quyền đó không?

Vì vậy, Responder đầu tiên luôn thiết lập "liên kết" với điều khiển giao diện người dùng có tiêu điểm. Có đúng không?

Trả lời

42

Ảnh tổng thể bên phải, chi tiết triển khai sai trong đoạn đầu tiên.

A "Đầu tiên Responder" trong một NibFile là một đối tượng ...

Không, thực sự, First Responder là nil. Việc kết nối điều khiển giao diện người dùng (ví dụ: nút) với Trả lời đầu tiên trong nib tương đương với [control setTarget:nil] trong mã.

Lý do đối tượng giả Responder đầu tiên trong cửa sổ nib là, trong IB, bạn đặt mục tiêu và hành động cùng một lúc (ctrl-kéo để nhắm mục tiêu, chọn hành động từ trình đơn bật lên). Bạn không thể đặt hành động và để mục tiêu không được đặt, giống như bạn có thể viết mã, do đó, để đặt nó thành nil, bạn cần làm như vậy một cách rõ ràng. Đó là điều mà Responder đầu tiên dành cho: đó là một đối tượng giả mạo đại diện cho nil, vì vậy bạn có thể đặt mục tiêu và hành động giống như cách bạn sẽ làm khi đặt nó vào một mục tiêu thực sự cụ thể.

Tất nhiên, bạn không thể sử dụng quyền này để đặt bất kỳ điều gì khác thành nil, chỉ các mục tiêu của lượt xem. Bạn chỉ có thể sử dụng nó để có nghĩa là Responder đầu tiên, không phải bất cứ điều gì khác.

Vì vậy, nếu klicks người dùng trên một điều khiển giao diện người dùng, các NIB đặt ...

Các nib không làm gì cả. Nó chỉ là một bộ sưu tập các vật thể được lưu trữ trên đĩa. Ngay cả khi bạn khởi tạo NSNib, tất cả những gì bạn đang làm là rã đông một số đối tượng. Đó là những đồ vật làm việc.

Trong trường hợp này, khi bạn hủy lưu trữ điều khiển bạn đã kết nối với First Responder từ ngòi bút, mục tiêu của nó được đặt thành nil (hãy nhớ, đó là những gì mà Responder thực sự là: mục tiêu nil). Khi mục tiêu của điều khiển là nil và người dùng nhấp vào nó, nó sẽ gửi hành động của mình đến bất kỳ người trả lời nào là người trả lời đầu tiên vào thời điểm đó.

Đoạn thứ hai và thứ ba của bạn là chính xác.

+0

cảm ơn. Bạn có thể giải thích những gì bạn có nghĩa là "mục tiêu"? – Thanks

+0

http://developer.apple.com/documentation/Cocoa/Conceptual/CocoaFundamentals/CommunicatingWithObjects/chapter_6_section_5.html#//apple_ref/doc/uid/TP40002974-CH7-SW31 –

+0

@Peter, liên kết của bạn trong nhận xét ở trên bị hỏng – Casebash

2

Kiểm tra liên kết này để thực hiện tốt công việc giải thích. Tôi nghĩ rằng bạn có các ý chính của nó:

http://cocoadev.com/FirstResponder

Từ nguồn:

Các FirstResponder là đối tượng đầu tiên trong chuỗi trả lời khi được đưa ra cơ hội để đáp ứng với một sự kiện .

+1

liên kết bạn đã đăng ở đây hiện bị hỏng – GoreDefex

3

Hiểu biết của bạn chưa hoàn chỉnh. responder chain bao gồm nhiều hơn những gì chúng ta thường nghĩ là "điều khiển giao diện người dùng", bao gồm quan trọng nhất là tài liệu hiện tại. Một trong những lợi ích lớn là nó cho phép bạn tương tác với cửa sổ hiện tại bất cứ điều gì "hiện tại", hiện tại, trường văn bản hiện tại, tài liệu hiện tại, v.v. - mà không có nhiều lộn xộn xung quanh để tìm nó.

2

Trả lời tự động là bất kỳ đối tượng nào sẽ thực hiện tác vụ (chức năng gọi) khi xảy ra sự kiện (chẳng hạn như nhấp vào nút). Chuỗi trả lời là một chuỗi các đối tượng được chứa trong nhau - ví dụ như một nút bên trong một bảng điều khiển bên trong một cửa sổ. Khi một sự kiện xảy ra, chúng tôi lặp qua chuỗi cho đến khi chúng tôi tìm thấy một đối tượng không có thiết bị trả lời được đặt thành nil và do đó có thể phản hồi sự kiện. Vì vậy, thay vì cung cấp một đối tượng phản hồi cho mỗi nút trong cửa sổ, chúng tôi có thể cung cấp một phản hồi duy nhất cho toàn bộ cửa sổ. Trả lời đầu tiên chỉ đơn giản là đối tượng đầu tiên bên trong chuỗi trả lời - liên kết một sự kiện với người trả lời đầu tiên cho phép sự kiện vượt qua chuỗi.

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