我有一個基於視圖的NSTableView,其視圖的NSTableCellView的設置是通過10.8.2上最新版本的Xcode中的接口生成器以圖形方式進行的。使用NSTableView調用reloadData時不可滿足的約束
當我打電話-reloadData在NSTableView的,它與崩潰:
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)>
我不能關閉自動調整大小面具翻譯對涉及任何與他們的約束意見由NSTableView的管理。很明顯,約束是衝突的,因爲NSTableRowView不可能有0高度,同時仍然滿足GroupTableRowView上指定超級視圖(行視圖?)之間的強制填充的其他兩個約束。我不知道如何解決這個問題,任何見解都將不勝感激。謝謝!
更新: 我找到了解決方法。問題是由於某種原因,在調用表視圖上的-reloadData時,NSTableRowView被髮送的幀大小爲{0, 0}
。我忽略了NSTableRowView子類中的-setFrameSize:
,並且只在尺寸不是{0,0}
時將消息傳遞給響應者鏈。
- (void)setFrameSize:(NSSize)newSize
{
if (!NSEqualSizes(newSize, NSZeroSize))
[super setFrameSize:newSize];
}
要使用的子類,實現NSTableViewDelegate的-tableView:rowViewForRow:方法返回定製子類的實例。
- (NSTableRowView *)tableView:(NSTableView *)tableView rowViewForRow:(NSInteger)row
{
id rowView = [[GroupTableRowView alloc] init];
// configure any custom properties
return rowView;
}
如果表視圖在IB完全設計,只需將新的NSView到您的表視圖,並設置它的自定義類到您的NSTableRowView子類,並改變它的用戶界面項目標識符NSTableViewRowViewKey
凹凸。在使用基於視圖的表格視圖時,我遇到了類似的問題。你的問題有什麼進展嗎? –
我使用解決方法更新了我的問題。我仍在尋找爲什麼NSTableCellView正在發送'{0,0}',但我無法在演示應用程序中重現此內容,以向Apple提交錯誤報告。 – Andrew
@Andrew我認爲這實際上是解決方案,謝謝! – NSAddict