1

うまくいく方法がいくつか思いつくので、これは一種のベスト プラクティスの質問です。

アウトラインビューを実装したい。OmniFocus に実装したいとしましょう (私の目的は非常に似ています)。

ここに画像の説明を入力

(サイドバーではなく、そのスクリーンショットのメイン ペインのアウトライン ビューを参照します。)

したがって、私のデータ型はtaskです。どのタスクにもサブタスクを含めることができます。各タスクには、1 つまたはゼロの親タスクがあります。アウトライン ビューで表示するための従来のデータ モデルですね。

しかし!ユーザーが選択したプロパティによって、これらのタスクを視覚的にグループ化できるようにしたいと考えています。マイルストーン割り当てられたユーザー、またはコンポーネントごとにグループ化できます。これらはたくさんあります。このグループ化は、この OmniFocus スクリーンショットの「受信ボックス」、「ホーム」、および「仕事」の項目と同様に、階層の最上位のアウトライン ビューに表示されます。

したがって、グループ化を表示するには、組み込みの NSOutlineView メソッド (デリゲート メソッド) を使用してグループ セルを描画する必要があることは明らかですoutlineView:isGroupItem:。問題は、このセットアップでは、アウトライン ビューの各アイテムが、接続先のデータ モデルのアイテムによって表されると想定していることです。そのため、タスクグループ ヘッダーの両方をデータ モデルで表す必要があります。

したがって、自分のタスクを表す Core Data テーブルにバインドするだけではダメです。バインディングをすべてやめて、古いスタイルのデータ ソース メソッドに戻ることもできますが、その場合、多くの有用なものが失われます。それで、中間点はありますか?

たとえば、別のクラスを作成できますTaskTemporaryGroup。そのクラスに ivar NSSet を与えます。これはsubtasks、タスクで子を取得するために使用できるのと同じキー パスです。次に、一連の TaskTemporaryGroup オブジェクトをツリー コントローラーにバインドすると、トップ レベルのアイテムが下位のアイテムとは異なるクラスであるという事実に関係なく、ツリー全体が配置されます。ドラッグ アンド ドロップを実装するときは、グループ化された行を任意にドラッグできないように注意する必要がありますが、うまくいく可能性があります。

もう 1 つの論点は、テーブル ヘッダーをクリックして各グループ内の行を並べ替えたいが、トップ レベルのグループを並べ替えたくないということです。NSTreeController がソート記述子を階層の各レベルに適用すると思いますか? 残りのセルをソートできるようにしたいキーパスのいずれかに対して、TaskTemporaryGroup クラスが同じもの (つまり、個別に計算した望ましいソート順) を返すようにすることができます。どのプロパティでソートされていても、同じ順序のままであるように見えます。これは良い方法ですか、それともハックですか?

要約すると、次のようになります。

  • 最上位レベルが特殊なケースで、後続のすべてのレベルが同じ種類のオブジェクトであるこの種の階層を実装することを人々はどのように提案しますか?
  • 子オブジェクトと同じキー パスにたまたま応答するトップ レベル オブジェクトを表すクラスを使用して、私が説明した方法は良い方法でしょうか?
  • このシナリオで並べ替えをうまく機能させる方法についてのヒントはありますか?
  • それとも、このタスクにバインディングを使用しようとすると、私は大変なことになるのでしょうか?

ありがとう、

エイミー

4

0 に答える 0