2012-06-10 29 views
7

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]; 
     } 

Trả lời

27

Có gì sai với -[NSWindow firstResponder], mà trả về responder đầu tiên trực tiếp?

+0

'- [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? –

+10

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 * /} '. –

+2

+1 để trả lời bằng câu hỏi. –

2

Nếu bạn chỉ muốn trả lời đầu tiên sau đó sử dụng phương pháp firstResponder của NSWindow.

Bạn có thể muốn sử dụng NSApplications targetForAction: phương pháp nếu bạn muốn trả lời đầu tiên cho một hành động cụ thể (như mouseDown:)

+0

Tôi không nghĩ đó là những gì tôi đang theo dõi. Tôi muốn nhận được "isFirstResponder" làm việc trong danh mục. Tôi không thực sự tìm kiếm phản hồi cho người dùng nhấp chuột. Tôi chỉ đề cập rằng kể từ khi người dùng nhấp vào một mục trong chế độ xem bảng, tôi cho rằng nó trở thành Người trả lời đầu tiên. Tất cả những gì tôi muốn làm là tìm phần trả lời đầu tiên theo chương trình. Tôi tự hỏi làm thế nào họ đã làm nó ở đây: http://stackoverflow.com/questions/1823317/how-do-i-legally-get-the-current-first-responder-on-the-screen-on-an-iphone –

+0

Tôi đã chỉnh sửa câu hỏi của mình trong một nỗ lực để làm cho nó rõ ràng hơn –

+0

@AA Tôi đã cập nhật câu trả lời của mình – diederikh

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