2013-09-23 70 views
9

Tôi có khá cơ bản MainWindow.xib với thanh bên kiểu danh sách nguồn. Tôi đã tạo bằng cách kéo mẫu Danh sách nguồn vào cửa sổ, đã chứa hai số NSTableCellView s: HeaderCellDataCell.NSTableCellViews phải được đặt ra như thế nào?

Loại thứ hai bao gồm biểu tượng (sử dụng NSImageView) và nhãn (NSTextField). Thay vào đó, tôi muốn nhãn và nhãn khác, nhãn nhỏ hơn bên dưới. Trong IB, điều này có vẻ như sau:

Source list according to IB

Nếu tôi chỉ tập trung vào DataCell, nó nổi bật phù hợp:

DataCell highlighted

Thing là, thực sự chạy chương trình, nó trông không có gì giống như mẫu:

Second item in live DataCell selected

Lưu ý cách hai số NSTextField chỉ bị đập vào nhau. Sự hiểu biết của tôi là NSOutlineView s (và xem dựa trên NSTableView s, cho rằng vấn đề) có nghĩa vụ phải được thiết kế như là một mẫu từ bên trong IB. Thay vào đó, các kích thước từ mẫu có vẻ hầu như bị bỏ qua.

Dưới đây là đoạn code mà bộ giá trị của cái nhìn từ các nguồn dữ liệu:

public class TourSourceListDelegate : NSOutlineViewDelegate 
{ 
    public override bool IsGroupItem(NSOutlineView outlineView, MonoMac.Foundation.NSObject item) 
    { 
     return (item as TourSourceListDataSource.Item).IsHeader; 
    } 

    public override NSView GetView(NSOutlineView outlineView, NSTableColumn tableColumn, MonoMac.Foundation.NSObject item) 
    { 
     if (IsGroupItem(outlineView, item)) 
     { 
      return outlineView.MakeView("HeaderCell", this); 
     } 
     else 
     { 
      var data = item as TourSourceListDataSource.Item; 
      var dataView = outlineView.MakeView("DataCell", this); 

      (dataView.Subviews[0] as NSTextField).StringValue = data.Name; 
      (dataView.Subviews[1] as NSTextField).StringValue = data.Date_start.ToShortDateString(); 

      return dataView; 
     } 
    } 
} 

Tôi đã thử trọng GetRowHeight, nhưng điều đó dường như không giải quyết vấn đề (nó làm cho căn phòng hơn, nhưng vẫn không cho phép các chế độ xem phân phối chính xác), cũng như không cần thiết.

Tôi cũng đã cố gắng chơi với các số khác nhau: Autosizing, Autoresizes Subviews, v.v. chuyển đổi thành IB, nhưng điều đó dường như không tạo ra kết quả trực quan, và một lần nữa, dường như không cần thiết. chính xác là những gì tôi muốn, chỉ với các nhãn hơi dài hơn trong thực tế.

Tôi chưa thử chuyển đổi cài đặt này thành AutoLayout.

Tôi đang thiếu bước hiển thị nào?

Một số thông tin khác có thể không tạo sự khác biệt: đây là dự án Xamarin.Mac/MonoMac với Xcode 5.0, MacOSX10.8.sdk, Xamarin Studio 4.0.12, Xamarin.Mac 4.0.12 và Mono 3.2.3 (nhắm mục tiêu Mono/.NET 4.0). Tôi cũng đã bật ứng dụng Sandboxing.

Trả lời

1

Điều quan trọng trong trình tạo giao diện là phân cấp khung nhìn. Loại tế bào đó là gì? Những nhãn đó thực sự là phần phụ của cellview hay không? Các hệ thống phân cấp nên giống như thế:

example NSOutlineView cell hiearchy

Một điều đó là tanh mà tôi thấy đang truy cập dataView.Subviews[0][1]. Nếu bạn đang thêm các bản xem trước vào các ô của mình thì bạn nên tạo các lớp con NSTableViewCell của riêng mình, với mỗi chế độ xem kết nối với thuộc tính 'IBOutlet lớp con'.Lớp con không cần bất kỳ mã nào trong quá trình triển khai, chỉ cần khai báo thuộc tính của nó trong @interface, chẳng hạn như titleFielddescriptionField và một số trống rỗng @implementation tự động tổng hợp chúng.

Sau đó makeViewWithIdentifier (hoặc apprently keo MakeView trong Xamarin) khi vượt qua được định danh đúng nên tạo NSTableViewCell lớp con của bạn, và khi chạy bạn có thể xác minh rằng việc sử dụng po dataView trong trình gỡ lỗi. Sau đó, bạn truy cập vào các bản xem trước bằng cách sử dụng các thuộc tính của giao diện NSTableViewCell lớp con 'thay vì giả sử chế độ xem nào ở vị trí nào có mảng subview, sử dụng dataView.titleFielddataView.descriptionField.

Nếu xem di động của bạn có một trường văn bản thì bạn có thể sử dụng NSTableViewCell mà không subclassing, nhưng đừng kết nối đến các ổ cắm textField (kết nối của nó theo mặc định chừng nào bạn không xóa & tái tạo tế bào xem của quan điểm nhãn), do đó bạn có thể truy cập nó thông qua tài sản, một lần nữa thay vì phải đi sâu vào mảng subviews.

Tất cả những gì đã nói, không rõ tại sao bạn lại thấy bạn là gì. Có vẻ như đó không phải là các bản xem trước bạn mong đợi và thậm chí có thể trông giống như phông chữ sai cũng như ở các vị trí sai. Sử dụng một lớp con tùy chỉnh của NSTableViewCell và xác minh lớp của nó trong thời gian chạy là một cách hay để đảm bảo rằng nó tạo chế độ xem bạn mong đợi, nhưng bạn cũng có thể kết xuất phần phụ trong trình gỡ lỗi bằng cách sử dụng po [dataView _subtreeDescription].