2013-01-04 24 views
6

我有一個基於視圖的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

+0

凹凸。在使用基於視圖的表格視圖時,我遇到了類似的問題。你的問題有什麼進展嗎? –

+0

我使用解決方法更新了我的問題。我仍在尋找爲什麼NSTableCellView正在發送'{0,0}',但我無法在演示應用程序中重現此內容,以向Apple提交錯誤報告。 – Andrew

+0

@Andrew我認爲這實際上是解決方案,謝謝! – NSAddict

回答

1

我有同樣的問題,它總是讓我瘋了..

我已經解決了它使用您的代碼,但子類NSTableRowView而不是NSTableCellView。要自動讓表格使用您的自定義行視圖,請將自定義NSView添加到您的表格中。將其類設置爲您的自定義行視圖,重要的是,其標識符爲NSTableViewRowViewKey

使用此特殊標識符時,表格會自動將其用作行視圖。

+0

你是對的,我回去看看我的代碼,我實際上是繼承NSTableRowView。謝謝! – Andrew

1

我有一個類似的問題,但列寬而不是行高。在調用reloadData後,立即在基於視圖的NSTableView的單元格上彈出不可滿足的自動佈局約束。在我的情況下,它是由NSTableColumn上的最小寬度設置太小而不能包含單元中約束的最小寬度引起的。所以對於任何有類似問題的人,我都會先驗證一下。

「有趣」的部分是,這只是reloadData的問題,而不是用於正常佈局,因爲NSTableView的寬度受到限制,無法正常嘗試創建小型單元。但是當調用reloadData時,它顯然會首先創建一個新的單元格,並將其框架大小設置爲最小列寬,然後再調整列的大小以適合正確(如果您已將表設置爲這樣)。所以即使所有東西看起來都很好,它仍然會在調用reloadData之後吐出關於不可滿足約束的錯誤,因爲單元格視圖的初始寬度對於填充等而言太小了。

這個故事的寓意是要始終檢查最小NSTableColumn寬度是在小區的約束足夠大,即使你不認爲柱將永遠是小。 IB可以輕鬆修改約束條件,並且在更改單元格中的某些內容後,很容易忘記重新檢查列寬選項。

+0

非常感謝!這節省了我幾個小時的痛苦調試。 –

相關問題