2011-08-17 54 views
5

Tôi hiện đang cố gắng sử dụng NSOutlineView dựa trên chế độ xem mới trong ứng dụng Cocoa của mình. Vì tôi không sử dụng các ràng buộc nên tôi đã triển khai tất cả các phương thức ủy quyền và nguồn dữ liệu được yêu cầu trong bộ điều khiển của mình.Các vấn đề phông chữ tiêu đề NSOutlineView dựa trên Xem

Trong trình tạo giao diện, tôi đã thêm NSOutlineView với bộ đánh dấu là SourceList và Chế độ nội dung được đặt thành Xem Dựa. Như vậy, đã có hai quan điểm ô trong bảng mặc định được cung cấp (một tế bào header với HeaderCell bộ như nhận dạng và một tế bào dữ liệu với DataCell bộ như định danh)

Đây là những gì nó trông giống như trong xây dựng giao diện, quan điểm ô tiêu đề hiển thị một cách chính xác một màu xám-xanh TextField trong khi quan điểm tế bào dữ liệu có một cái nhìn hình ảnh và một TextField với màu sắc và phông chữ cài đặt chính xác

để cung cấp các quan điểm, tôi sử dụng đoạn mã sau, để trở về một DataCell- xem hoặc một khung nhìn HeaderCell và thiết lập textField của ô tương ứng, dựa trên số nhận dạng tương ứng được đặt trong trình tạo giao diện.

- (NSView *)outlineView:(NSOutlineView *)outlineView 
    viewForTableColumn:(NSTableColumn *)tableColumn 
        item:(id)item { 


    NSTableCellView *result = nil; 

    if ([item isKindOfClass:[NSMutableDictionary class]]) { 
     result = [outlineView makeViewWithIdentifier:@"HeaderCell" owner:self]; 

     id parentObject = [outlineView parentForItem:item] ? [outlineView parentForItem:item] : groupedRoster; 
     [[result textField] setStringValue:[[parentObject allKeys] objectAtIndex:0]]; 


    } else { 
     result = [outlineView makeViewWithIdentifier:@"DataCell" owner:self]; 

     [item nickname] ? [[result textField] setStringValue:[item nickname]] : [[result textField] setStringValue:[[item jid] bare]]; 
    } 
    return result; 
} 

Chạy mọi thứ trông như sau.

Ai có thể cung cấp cho tôi các gợi ý, tại sao ô tiêu đề không in đậm, cũng không được tô màu chính xác khi được chọn?

Trả lời

11

Bạn cần triển khai phương thức -outlineView: isGroupItem: delegate và trả về YES cho các hàng tiêu đề của bạn. Điều đó sẽ chuẩn hóa phông chữ và thay thế tam giác tiết lộ ở bên trái bằng nút Hiện/Ẩn ở bên phải. Bạn sẽ vẫn cần phải viết hoa theo cách thủ công chuỗi của bạn để có được hiệu ứng đầy đủ.

Tôi không chắc liệu phương thức ủy nhiệm của hàng nhóm ở trên có làm cho kiểu lựa chọn có được nhìn hay không. Tuy nhiên, bạn thường không muốn các hàng tiêu đề có thể lựa chọn ở tất cả trong danh sách nguồn, mà bạn bằng cách trả về NO cho các mục tiêu đề từ phương thức -outlineView: shouldSelectItem: delegate.

+1

Tuyệt vời, cảm ơn, điều này là chính xác những gì tôi đang tìm kiếm. Trong trường hợp người khác gặp sự cố, hãy sử dụng setFloatsGroupRows: NO để ngăn mục đầu tiên * nhảy * lên và xuống khi mở rộng và thu gọn theo [bài đăng này] (http: // stackoverflow.com/questions/6814620/strange-behavior-using-view-based-nsoutline-sourcelist) – BinaryBucks

+0

Khi tôi đang ở đó và mọi thứ hiển thị chính xác, các công trình mã trên không thực sự hoạt động trôi chảy khi mở rộng/thu gọn một nhóm như nó là trường hợp trong ví dụ Trình tìm kiếm. Có allways một stuttering nhẹ nhưng đáng chú ý trong hoạt hình và tải CPU khá nặng, như thể xem là mới được phân bổ. Nếu tôi chỉ sử dụng makeViewWithIdentifer với một mã định danh duy nhất, sao cho mỗi ô là một ô tiêu đề (hoặc ô dữ liệu, không bị mờ), mọi thứ hoạt động trôi chảy. Bất kỳ gợi ý nào tại sao? – BinaryBucks

+0

Vâng, toàn bộ tài sản floatsGroupRows chỉ bị phá vỡ cho các khung nhìn phác thảo. Chưa thấy vấn đề hiệu suất mà bạn mô tả. Có lẽ một hồi quy Core Animation từ một superview được hỗ trợ bởi lớp? Dunno. –

2

Tôi đã tạo một dự án mẫu nhỏ bao gồm danh sách nguồn và cũng sử dụng phương thức -outlineView:isGroupItem: như @ boaz-stuller đã đề xuất.

  • hiển thị một danh sách các mục
  • Chỉnh sửa các mục trong một thời trang master-chi tiết
  • Remove và thêm các mục
  • Sử dụng bindings

Check-out besi/mac-quickies trên github. Hầu hết những thứ được hoặc thực hiện trong IB hoặc có thể được tìm thấy trong các AppDelegate

screenshot

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