2011-08-27 63 views
5

Tôi vẫn đang đấu tranh với NSOutlineView dựa trên chế độ xem trong ứng dụng Cocoa nhỏ của tôi. Tôi đang cố gắng mô hình OutlineView của tôi sau khi tìm thấy một. Khi OutlineView của Finder mất tiêu điểm (ví dụ: nhấp vào bất kỳ thư mục nào ở bên phải), hàng đã chọn (ví dụ: Máy tính để bàn) vẫn được chọn với độ dốc màu xanh lam nhạt và không thay đổi thành màu xám xám không hoạt động.Chọn lựa dựa trên NSOutlineview gradient

Tôi muốn nhân bản hành vi này trong ứng dụng của mình.

Trong OutlineView không dựa trên chế độ xem, tôi có thể phân lớp NSOutlineView và triển khai lại (void)highlightSelectionInClipRect:(NSRect)clipRect để mỗi hàng được đánh dấu có thể được cung cấp cùng với hình nền màu xanh lam sáng.

Tuy nhiên, bây giờ với OutlineView dựa trên khung nhìn của tôi (được đặt thành kiểu SourceList), phương thức này dường như thậm chí không được gọi. Tôi thậm chí đã thực hiện (id)_highlightColorForCell:(NSCell *)cell để trả về nil, như một số trang web đề xuất, nhưng điều đó cũng không giúp được gì.

Bất kỳ gợi ý nào về cách tôi có thể đặt độ sáng nổi bật trong OutlineView dựa trên chế độ xem?

+0

Tôi gặp sự cố chính xác này. – tofutim

Trả lời

8

Bạn có thực hiện bất kỳ bản vẽ tùy chỉnh nào có thể gây rối với mọi thứ không? Theo như tôi có thể nói tất cả các bản vẽ lựa chọn được xử lý cho bạn bình thường, hãy kiểm tra TableViewPlayground example (không phải kiểu danh sách nguồn theo mặc định nhưng đó là một thay đổi dễ dàng đối với XIB).

Nhưng thất bại đó, theo quy định của Mac OS X 10.7 entry doc trên highlightSelectionInClipRect:

Lưu ý: Phương pháp này không nên được subclassed hoặc ghi đè cho một cái nhìn bảng điểm-base. Thay vào đó, tùy chỉnh vẽ hàng phải được thực hiện bằng cách phân lớp NSTableRowView.

Vì vậy, tôi nghĩ (tôi đã không cố gắng nào của điều này) như bạn muốn phân lớp NSTableRowView, ghi đè drawSelectionInRect: (có một example trong TableViewPlayground, và vẽ lựa chọn của bạn. Bạn có thể kiểm tra các ứng dụng đang hoạt động với [NSApp active] hoặc có thể sử dụng self.emphasized tài sản như ví dụ làm

sau đó bạn sẽ quay trở lại một trong những NSTableRowViews tùy chỉnh của bạn trong phương pháp giao thức NSOutlineViewDelegate. (10.7 chỉ!): (NSTableRowView *)outlineView:(NSOutlineView *)outlineView rowViewForItem:(id)item

Hope này làm việc/giúp

!

Tôi nên lưu ý rằng ví dụ TableViewPlayground sử dụng phương thức ủy nhiệm outlineView:viewForTableColumn:item: theo mặc định và thực hiện mọi thứ với NSTableViewCells, nhưng nếu bạn thêm phương thức rowViewForItem tôi đề cập ở trên, thì được gọi là. Vì vậy, tôi đoán bạn có thể sử dụng nó để trả lại một lượt xem cho mỗi hàng trong toàn bộ.

6

Cảm ơn, với gợi ý của bạn, tôi đã có thể giải quyết vấn đề khá dễ dàng. Tôi được phân loại là NSTableRowView và ghi đè -(BOOL) isEmphasized để luôn trả về giá trị đúng.

sau đó tôi thực hiện -(NSTableRowView *)outlineView:(NSOutlineView *)outlineView rowViewForItem:(id)item trong đoàn OutlineViews tôi trở về một trường hợp cụ thể mục của lớp con của tôi bằng cách gọi ClbTableRowView *result = [outlineView makeViewWithIdentifier:identifier owner:self];

Edit: Bên cạnh đó, cũng có vẻ là một cách khá ẩn của việc sử dụng tùy chỉnh NSTableRowView lớp con bằng cách thả một đối tượng NSView mới vào OutlineView trong Interface Builder.Sau đó, thiết lập lớp views cho lớp con của bạn và cung cấp cho nó một mã định danh mục người dùng của "NSTableViewRowViewKey", theo số Apple documentation.

+0

+1 cho "NSTableViewRowViewKey" đó. Đã cho tôi một thời gian để tìm thấy điều đó. Nó thực sự khá ẩn –

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