Tôi muốn tìm chế độ xem trả lời đầu tiên trong cửa sổ. Để làm điều này, tôi muốn thực hiện một thể loại như thế này:Làm cách nào để nhận phản hồi đầu tiên hiện tại từ bộ điều khiển cửa sổ trong Cocoa?
@implementation NSView (ViewExtensions)
- (NSView *)findFirstResponder
{
if ([self isFirstResponder]) {
return self;
}
for (NSView *subView in [self subviews]) {
NSView *firstResponder = [subView findFirstResponder];
if (firstResponder != nil) {
return firstResponder;
}
}
return nil;
}
@end
Đoạn mã trên được dựa trên câu hỏi này/câu trả lời trên SO: Get the current first responder without using a private API.
Vấn đề có thể là NSResponder không có phương thức isFirstResponder như UIResponder. Tương đương với NSResponder là gì?
Nếu phương pháp trên được thực hiện như trên, tôi tất nhiên nhận được thông báo gỡ lỗi: "'NSView' có thể không phản hồi 'isFirstResponder'".
Làm cách nào để làm cho công cụ findFirstResponder hoạt động trong Cocoa?
Thông tin thêm: Sau này tôi muốn sử dụng các phương pháp trên trong điều khiển cửa sổ của tôi một cách nào đó như:
NSArray *copiedObjects;
if ([[self window]contentView] == MyTableView) {
copiedObjects = [tableController selectedObjects];
}
if ([[self window]contentView] == MyOutlineView) {
copiedObjects = [treeController selectedFolders];
}
'- [NSWindow firstResponder]' trả về NSResponder. Làm thế nào để có được NSView đó là người trả lời đầu tiên? Sau đó, tôi có thể làm 'if (firsResponderView == MyTableView)', tức là kiểm tra xem một khung nhìn có phải là đáp ứng đầu tiên hiện tại không? –
Chế độ xem ** là ** trả lời tự động - 'NSView' kế thừa từ' NSResponder'. Vì vậy, câu lệnh 'if' của bạn sẽ hoạt động. Đối với trường hợp chung, bạn có thể làm 'if ([firstResponder isKindOfClass: [lớp NSView]]) {NSView * firstResponderView = (NSView *) firstResponder;/* làm điều gì đó với firstResponderView * /} '. –
+1 để trả lời bằng câu hỏi. –