2013-01-04 26 views
6

Tôi có NSTableView dựa trên khung nhìn với thiết lập NSTableCellView của khung nhìn đồ họa thông qua trình tạo giao diện trong phiên bản mới nhất của Xcode trên 10.8.2.Các ràng buộc không thỏa mãn với NSTableView khi gọi reloadData

Khi tôi gọi -reloadData trên NSTableView, nó bị treo với:

Unable to simultaneously satisfy constraints: 
(
    "<NSAutoresizingMaskLayoutConstraint:0x105cb8bf0 h=--& v=--& V:[NSTableRowView:0x105ca7020(0)]>", 
    "<NSAutoresizingMaskLayoutConstraint:0x10596aa30 h=--& v=-&- V:[GroupTableRowView]-(2)-| (Names: GroupTableRowView:0x100185860, '|':NSTableRowView:0x105ca7020)>", 
    "<NSAutoresizingMaskLayoutConstraint:0x1058d9770 h=--& v=-&- V:|-(1)-[GroupTableRowView] (Names: GroupTableRowView:0x100185860, '|':NSTableRowView:0x105ca7020)>" 
) 

Will attempt to recover by breaking constraint 
<NSAutoresizingMaskLayoutConstraint:0x10596aa30 h=--& v=-&- V:[GroupTableRowView]-(2)-| (Names: GroupTableRowView:0x100185860, '|':NSTableRowView:0x105ca7020)> 

Tôi không thể tắt tính năng tự động thay đổi kích thước mặt nạ dịch trên bất kỳ quan điểm tham gia như những hạn chế của họ được quản lý bởi NSTableView. Rõ ràng là các ràng buộc là mâu thuẫn bởi vì NSTableRowView không thể có chiều cao 0 trong khi vẫn đáp ứng hai ràng buộc khác trên GroupTableRowView chỉ định đệm bắt buộc giữa superview (chế độ xem hàng?). Tôi không chắc chắn làm thế nào để giải quyết này, bất kỳ thông tin chi tiết sẽ được đánh giá rất nhiều. Cảm ơn!

Cập nhật: Tôi tìm thấy giải pháp thay thế. Vấn đề là vì một số lý do NSTableRowView đã được gửi một kích thước khung hình {0, 0} khi gọi -reloadData trên màn hình bảng. Tôi overrode -setFrameSize: trong lớp con NSTableRowView và chỉ vượt qua tin nhắn lên chuỗi trả lời khi kích thước không phải là {0,0}.

- (void)setFrameSize:(NSSize)newSize 
{ 
    if (!NSEqualSizes(newSize, NSZeroSize)) 
     [super setFrameSize:newSize]; 
} 

Để sử dụng phân lớp, hãy thực hiện phương thức của NSTableViewDelegate -tableView:rowViewForRow: để trả lại phiên bản của lớp con tùy chỉnh.

- (NSTableRowView *)tableView:(NSTableView *)tableView rowViewForRow:(NSInteger)row 
{ 
    id rowView = [[GroupTableRowView alloc] init]; 
    // configure any custom properties 
    return rowView; 
} 

Nếu xem bảng được thiết kế hoàn toàn bằng IB, bạn chỉ có thể kéo một NSView mới vào xem bảng của bạn và thiết lập nó là lớp tùy chỉnh để lớp con NSTableRowView của bạn và thay đổi nó là giao diện người dùng mục định danh để NSTableViewRowViewKey

+0

Bump. Tôi đã gặp phải một vấn đề tương tự khi sử dụng chế độ xem bảng dựa trên chế độ xem. Bạn có thực hiện bất kỳ tiến bộ nào về vấn đề của mình không? –

+0

Tôi đã cập nhật câu hỏi của mình với giải pháp thay thế. Tôi vẫn đang tìm kiếm lý do tại sao NSTableCellView đang được gửi '{0,0}' nhưng tôi không thể tái tạo điều này trong một ứng dụng demo để gửi báo cáo lỗi cho Apple. – Andrew

+0

@Andrew Tôi nghĩ đây thực sự là giải pháp, cảm ơn vì điều này! – NSAddict

Trả lời

1

Tôi đã có cùng một vấn đề và nó luôn luôn lái xe cho tôi hạt ..

Tôi đã giải quyết nó bằng cách sử dụng mã của bạn, nhưng phân lớp NSTableRowView thay vì NSTableCellView. Để tự động cho phép bảng sử dụng chế độ xem hàng tùy chỉnh của bạn, hãy thêm NSView tùy chỉnh vào bảng của bạn. Đặt lớp của nó thành chế độ xem hàng tùy chỉnh của bạn và quan trọng là số nhận dạng của nó là NSTableViewRowViewKey.

Với số nhận dạng đặc biệt này, bảng sẽ tự động sử dụng nó làm chế độ xem hàng.

+0

Bạn nói đúng, tôi quay lại và xem mã của tôi và tôi đang thực sự phân lớp NSTableRowView. Cảm ơn! – Andrew

1

Tôi gặp sự cố tương tự nhưng với chiều rộng cột chứ không phải chiều cao hàng. Các ràng buộc tự động trả lời không thỏa mãn được bật lên trên các ô dựa trên số lượt xem NSTableView ngay sau khi reloadData được gọi. Trong trường hợp của tôi, nguyên nhân là do cài đặt chiều rộng tối thiểu trên NSTableColumn quá nhỏ để chứa chiều rộng tối thiểu cho các ràng buộc trong ô. Vì vậy, đối với bất kỳ ai có vấn đề tương tự, trước tiên tôi sẽ xác minh điều đó.

Phần "thú vị" là đây chỉ là vấn đề cho reloadData, không phải cho bố cục bình thường, bởi vì có những hạn chế về chiều rộng của NSTableView ngăn không cho nó thường tạo ra một ô nhỏ. Nhưng khi reloadData được gọi, trước tiên nó sẽ tạo một ô mới với kích thước khung được đặt thành chiều rộng cột tối thiểu, trước khi thay đổi kích thước cột để vừa với đúng (nếu bạn có bảng được đặt để làm điều đó). Vì vậy, mặc dù mọi thứ dường như hoạt động tốt, nó vẫn sẽ phun ra lỗi về các ràng buộc không thỏa mãn ngay sau khi reloadData được gọi, vì chiều rộng ban đầu của chế độ xem ô là quá nhỏ cho phần đệm, v.v.

Đạo đức của câu chuyện là luôn kiểm tra rằng chiều rộng tối thiểu tối thiểuNSTableColumn đủ lớn cho các ràng buộc trong ô, ngay cả khi bạn không nghĩ cột sẽ nhỏ như vậy. IB làm cho nó dễ dàng để tinker với những khó khăn, và thật dễ dàng để quên kiểm tra lại các tùy chọn chiều rộng cột sau khi thay đổi một cái gì đó trong các tế bào.

+0

Cảm ơn rất nhiều! Điều này tiết kiệm cho tôi giờ gỡ lỗi đau đớn. –

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