6

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

4

2 に答える 2

1

同様の問題がありましたが、行の高さではなく列の幅がありました。NSTableViewが呼び出された直後に、ビューベースの のセルに満たされない自動レイアウト制約が表示されていましたreloadData。私の場合、NSTableColumnセル内の制約の最小幅を含めるには小さすぎる最小幅設定が原因でした。したがって、同様の問題を抱えている人は、まずそれを確認します。

「興味深い」部分は、これはreloadData通常のレイアウトではなく、 のみの問題であるということでした。これは、 の幅に制約があり、NSTableView通常は小さいセルを作成しようとすることを妨げていたためです。しかし、reloadDataが呼び出されると、最初にフレーム サイズが最小の列幅に設定された新しいセルが作成され、後で適切に収まるように列のサイズが変更されます (テーブルがそのように設定されている場合)。reloadDataそのため、すべてが正常に動作しているように見えても、セル ビューの初期幅がパディングに対して小さすぎるなどの理由で、 が呼び出された直後に満たされない制約に関するエラーが吐き出されます。

ストーリーの教訓は、列がそれほど小さいとは思わない場合でも、最小幅がセル内の制約に対して十分な大きさであることを常に確認することです。 NSTableColumnIB を使用すると、制約を簡単にいじることができ、セル内で何かを変更した後に列幅オプションを再確認するのを忘れがちです。

于 2013-08-22T21:29:01.583 に答える
1

私は同じ問題を抱えていて、いつも私を夢中にさせました..

あなたのコードを使用して解決しましたが、NSTableRowView代わりにサブクラス化していますNSTableCellView。テーブルがカスタム行ビューを自動的に使用できるようにするには、テーブルにカスタムNSViewを追加します。そのクラスをカスタム行ビューに設定し、重要なことに、その識別子を に設定しNSTableViewRowViewKeyます。

この特別な識別子を使用すると、テーブルは自動的にそれを行ビューとして使用します。

于 2013-04-03T13:44:23.587 に答える