2011-11-23 37 views
5

Tôi đang cố gắng để có được một bảng bố trí như hình dưới đây làm việc với NSTableViews dựa trên xem đã được giới thiệu trong Lion.Cách thêm hàng trong NSTableView dựa trên chế độ xem?

Có nhiều cách tiếp cận được mô tả cho NSTableViews dựa trên ô, ví dụ: Mimic the artwork column, nhưng chúng không thực sự áp dụng cho chế độ xem bảng dựa trên chế độ xem.

Ý tưởng là bảng được điền bởi một mảng đối tượng, trong một (hoặc nhiều) cột trải rộng các hàng cho biết rằng các đối tượng chia sẻ một số dữ liệu chung. numberOfRowsInTableView: trả về tổng số mục (19 trong trường hợp hình ảnh đính kèm).

Có ai đã thử một cái gì đó như thế này không?

Layout

Groups/sections displayed using spanning rows

Trả lời

5

Tôi có thể thực hiện điều này bằng cách sử dụng hai NSTableView riêng biệt có đồng bộ cuộn của NSScrollView được đồng bộ. Để tìm hiểu cách đồng bộ hóa nhiều chế độ xem cuộn (với mã lớp chính xác), hãy đọc Scroll View Programming Guide for Mac - Synchronizing Scroll Views

Tôi có groupTableChế độ xem có một cột và hiển thị các chế độ xem đại diện cho nhóm. Tôi cũng có itemTableView có các cột đại diện cho các mục của nhóm. Tôi sử dụng cùng một phương thức delegate/datasource với các câu lệnh if-else để kiểm tra xem NSTableView nào đang được sử dụng và trả lời tương ứng với # hàng, xem ô, vv .. Ngoài ra, tôi thực hiện phương thức ủy nhiệm sau để điều chỉnh bảng nhóm quan điểm của chiều cao hàng để bằng tổng các chiều cao dòng sản phẩm của các hàng trong nhóm:

- (CGFloat)tableView:(NSTableView *)tableView heightOfRow:(NSInteger)row 
{ 
    if (tableView == self.groupTableView) { 
     NSUInteger firstRowIndexForGroup = ...; 
     NSUInteger lastRowIndexForGroup = ...; 
     CGFloat groupHeight = 0.0; 
     for (NSUInteger currentRowIndex = firstRowIndexForGroup; currentRowIndex <= lastRowIndexForGroup; currentRowIndex++) { 
      groupHeight += [self.itemTableView rectOfRow:lastRowIndexForGroup].size.height; 
     } 
     return groupHeight - [self.itemTableView intercellSpacing].height; 
    } else { 
     return self.itemTableView.rowHeight; 
    } 
} 

Bạn cũng phải gọi -noteHeightOfRowsWithIndexesChanged: mỗi khi xem bảng cần một cái nhìn nhóm bởi vì chiều cao thay đổi theo số lượng hàng trong nhóm.

- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row 
{ 
    if (tableView == self.groupTableView) { 
     GroupRowView *view = [tableView makeViewWithIdentifier:tableColumn.identifier owner:self]; 
     // configure view 
     [tableView noteHeightOfRowsWithIndexesChanged:[NSIndexSet indexSetWithIndex:row]]; 
     return view; 
    } else { 
     ItemRowView *view = [tableView makeViewWithIdentifier:tableColumn.identifier owner:self]; 
     // configure view 
     return view; 
    } 
} 

Tôi đã tắt lựa chọn hàng và thanh cuộn ngang và dọc trên chế độ xem bảng nhóm. Tôi cũng làm cho lưới rắn nằm ngang cho cả hai chế độ xem bảng. Cuối cùng, tôi đặt trực tiếp chế độ xem bảng nhóm bên cạnh chế độ xem bảng mục mà không có khoảng trống ở giữa vì vậy nó xuất hiện như thể nó chỉ là một cột khác trong một chế độ xem bảng. Kết quả là một triển khai hoàn hảo có độ trễ bằng không giữa các lần xem bảng. Đối với người dùng, có vẻ như đó là một chế độ xem bảng duy nhất.

+0

Oh wow ... đây chắc chắn là một giải pháp không chính xác đánh đầu tiên trong đầu tôi! Đã làm việc với cuộn đồng bộ trước khi tôi có thể xem nó hoạt động như thế nào. Có lẽ một điều cần thêm là nếu ô nhóm được nhấp/chọn thì điều này sẽ phải 'chuyển tiếp' vùng chọn đến hàng đầu tiên của chế độ xem bảng mục. – klotz

+0

Bạn cũng có thể chia bảng xem nhóm thành hai tùy chọn cho mỗi nhóm, theo cách này bạn có thể làm nổi bật hàng đầu phía trên các nhóm khác, vì vậy nếu bạn có một nhóm lớn, thông tin nhóm của bạn sẽ nổi cho đến khi mục nhóm cuối cùng cuộn đi màn. – Andrew

+0

Bạn đã làm gì để giữ cho các hàng của bảng mục được đồng bộ với bảng nhóm? Làm thế nào để bạn giữ cho các bảng mục từ phân loại các hàng của nó để chúng không tương ứng với nhóm họ đang ở bên cạnh? – erynofwales

0

thể bạn không sử dụng một NSOutlineView để thay thế? Nó được thiết kế đặc biệt để hỗ trợ nhóm.

+0

Nhưng làm thế nào bạn sẽ nhận được giá trị nhóm vào một ô có chiều cao là tổng chiều cao của tất cả các hàng nút con thay vì sử dụng hàng rất riêng của nó? – klotz

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