2012-04-30 5 views
1

私のCocoaアプリケーションでは、1列のNSTableViewのシートがあり、ディレクトリにたくさんのファイルがリストアップされています(このアプリケーションはメインデータベースのバックアップを作成し、このリストをユーザーに提供して、バックアップ)。コンテンツは、NSArrayControllerによってテーブルビューにロードされ、各オブジェクトはNSFileWrapperです(代わりにNSURLの使用を検討していますが、私は逃げ出します)。 NSArrayControllerは並べ替えを処理し、バインディングを介して行が選択されたときにボタンを有効にします。私はNSWindowControllerサブクラスオブジェクト(BackupsSheetController)を持っており、これらのすべてをフックし、シートのペン先に存在します。NSArrayControllerを使用しているときにNSTableViewの編集に直接応答する方法はありますか?

しかし、ユーザーがセルの1つを編集するときに、そのセルが表すファイルの名前を適切に変更して新しい場所に配置することで、その変更に対応したいと思います。テーブルビューはNSArrayControllerにバインドされているので、私はNSTableViewDataSourceメッセージ– tableView:setObjectValue:forTableColumn:row:を送信しません。私がBackupsSheetControllerをペン先のNSTableViewオブジェクトのデータソースとして設定した場合、そのメッセージはに送信されますが、時々というメッセージは送信されますが、あまり頻繁ではありません。

ほとんどの質問と例このシナリオでは、テーブルビューのアイテムにカスタムモデルクラスを使用してこのすべてを処理し、応答したいプロパティを変更するオブザーバーをコントローラオブジェクトにします。言い換えれば、各アイテムはBackupNodeオブジェクトのようなものになり、BackupsSheetControllerはnameプロパティ(またはそれを呼び出すもの)の変更をそれぞれ監視します。それは私のシナリオでは非常に残酷なようですが、すでに使用しているバインディングを取り除きたくないので、これを行う別の方法はありません。 setObject:...メッセージを確実に受け取れるように、これを行う別の方法はありますか?またはNSArrayControllerを削除して、BackupsSheetControllerをテーブルのデリゲートとデータソースにする必要がありますか?

答えて

2

"BackupNode"シナリオでは、なぜBackupsSheetControllerがそれぞれの名前の変更を監視するのかわかりません。これは非常にラウンドアバウトなやり方です。私は、仮定的なBackupNodeオブジェクトは、nameプロパティのセッターで必要な作業を行うだけだと思います。

とにかく、適切なモデルオブジェクトを使用することをおすすめします。 NSFileWrapperNSURL、またはNSMutableDictionaryのようなCocoa提供のオブジェクトのみを使用してモデルを構築しようとすると、適切なモデルオブジェクトを作成するよりも長期的に多くの作業が終了します。

接線のトピックでは、なぜあなたのウィンドウコントローラはNIBにありますか?これは、NIBをロードする(および所有する)ものでなければなりません。NIBがロードされる前に存在する必要があります。つまり、NIBでインスタンス化できません。

+0

接尾辞:nibの所有者は、nibからロードしてシートとして提示するNSDocumentサブクラスです。 'コントローラ'オブジェクトは、シートのアクションを処理し、そのオブジェクトにバインドし、ドキュメントサブクラスからそのアイテムを保持するために存在し、かなり大きくなります。確かにそこに他のアイデアにオープン! –

+0

>「とにかく、適切なモデルオブジェクトを使用することをおすすめします。 あなたと私の両方、私はちょうどモデルとしてバックアップを考えていなかった、私は鈍っていた、私は仮定する;-) –

関連する問題