2012-04-17 22 views
5

Tôi có NSTableView một cột dựa trên chế độ xem. Bên trong lớp con NSTableCellView của tôi, tôi có một NSTextView có thể chọn, nhưng không thể chỉnh sửa được.Làm thế nào để chọn một hàng trong một NSTableView khi nhấp vào một NSTextView bên trong một NSTableCellView?

Khi người dùng nhấp trực tiếp vào NSTableCellView, hàng sẽ hiển thị chính xác. Nhưng khi người dùng nhấp vào NSTextView bên trong NSTableCellView đó, hàng không làm nổi bật.

Làm cách nào để tôi nhấp vào NSTextView để chuyển đến NSTableCellView để hàng nổi bật?

hệ thống phân cấp lớp trông giống như: NSScrollView> NSTableView> NSTableColumn> NSTableCellView> NSTextView

+0

Tôi không thể lặp lại những gì bạn đang nhìn thấy. Khi tôi thêm một trường văn bản vào ô dựa trên khung nhìn, nhấp vào nó sẽ chọn hàng không phải là trường văn bản (tôi phải bấm lại để làm điều đó xảy ra). Bạn có nó bị ràng buộc với bất cứ điều gì, hoặc bạn đang sử dụng một nguồn dữ liệu? – rdelmar

+0

Tôi đang sử dụng NSTextView chứ không phải NSTextField. Có, tôi nhận được cùng một hành vi như bạn làm với các trường văn bản, nhưng ứng dụng của tôi yêu cầu các bản xem trước văn bản. – sam

Trả lời

6

Đây là những gì tôi đã kết thúc làm. Tôi đã thực hiện một lớp con của NSTextView và overrode mouseDown: như sau ...

- (void)mouseDown:(NSEvent *)theEvent 
{ 
    // Notify delegate that this text view was clicked and then 
    // handled the click natively as well. 
    [[self myTextViewDelegate] didClickMyTextView:self]; 
    [super mouseDown:theEvent]; 
} 

Tôi đang sử dụng lại các đại biểu tiêu chuẩn NSTextView của ...

- (id<MyTextViewDelegate>)myTextViewDelegate 
{ 
    // See the following for info on formal protocols: 
    // stackoverflow.com/questions/4635845/how-to-add-a-method-to-an-existing-protocol-in-cocoa 
    if ([self.delegate conformsToProtocol:@protocol(MyTextViewDelegate)]) { 
     return (id<MyTextViewDelegate>)self.delegate; 
    } 
    return nil; 
} 

Và trong tiêu đề ...

@protocol MyTextViewDelegate <NSTextViewDelegate> 
- (void)didClickMyTextView:(id)sender; 
@end 

Trong đại biểu, tôi triển khai didClickMyTextView: để chọn hàng.

- (void)didClickMyTextView:(id)sender 
{ 
    // User clicked a text view. Select its underlying row. 
    [self.tableView selectRowIndexes:[NSIndexSet indexSetWithIndex:[self.tableView rowForView:sender]] byExtendingSelection:NO]; 
} 
+0

Gọn gàng - hai hành động không xung đột trong một sự kiện. Bạn đã tạo ra một mẫu thiết kế có thể áp dụng trong nhiều tình huống. – Wienke

+0

một câu trả lời cho mọi vấn đề, giải pháp tuyệt vời. – mohacs

0

Tôi nghĩ rằng bạn có về cơ bản cùng một vấn đề tôi đã ở đây: pass event on. Xem câu trả lời được chấp nhận.

Tiếp theo cùng một khuôn mẫu, bạn sẽ phân lớp NSTextView và ghi đè - (void)mouseUp:(NSEvent *)theEvent để vượt qua sự kiện này sang SuperView, mà tôi giả sử là tableView:

- (void)mouseUp:(NSEvent *)theEvent { 
    [superView mouseUp:theEvent]; 
} 
+1

Không may mắn. Ghi đè mouseUp: và gửi sự kiện tới superView dường như không làm gì cả. Sau đó, tôi đã cố gắng ghi đè mouseDown: và gửi sự kiện tới superView. Điều đó không chọn hàng, nhưng sau đó tôi mất khả năng chọn văn bản (về cơ bản là chức năng chuột của chế độ xem văn bản). Tôi đã giải quyết điều này như được mô tả trong câu trả lời của tôi và nó không quá khác so với những gì bạn nghĩ. – sam

1

hoặc sử dụng một NSTextField, và sau đó,

textfield.bezeled = NO; 
textfield.drawsBackground = NO; 
textfield.editable = NO; 
textfield.selectable = YES; 
[textfield setRefusesFirstResponder: YES]; 
Các vấn đề liên quan