10.8.2 の最新バージョンの Xcode で、インターフェイス ビルダーを介してグラフィカルにテーブル ビューの NSTableCellView をセットアップしたビューベースの NSTableView があります。
NSTableView で -reloadData を呼び出すと、次のようにクラッシュします。
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 によって管理されているため、関連するビューの自動サイズ変更マスク変換をオフにすることはできません。スーパービュー (行ビュー?) 間の必須パディングを指定する GroupTableRowView の他の 2 つの制約を満たしながら、NSTableRowView の高さを 0 にすることはできないため、制約が競合していることは明らかです。これを解決する方法がわかりません。洞察をいただければ幸いです。ありがとう!
更新:回避策を見つけました。{0, 0}
問題は、テーブル ビューで -reloadData を呼び出したときに、何らかの理由で NSTableRowView に のフレーム サイズが送信されていたことです。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