1

私の Cocoa アプリにはNSTableView、ディレクトリ内の一連のファイルをリストする 1 列のシートがあります (アプリはメイン データベースのバックアップを作成し、このリストをユーザーに提供して、特定のバックアップに戻すことができるようにします) )。コンテンツは によってテーブル ビューにロードされ、提供されますNSArrayController。各オブジェクトは単なるNSFileWrapperです (代わりに NSURL を使用することを検討していますが、余談になります)。NSArrayController は並べ替えを処理し、バインディングを介して行が選択されたときにボタンを有効にします。これはすべて素晴らしいことです。これらすべてを接続し、シートの nib に存在するサブクラス オブジェクト ( ) がありますNSWindowControllerBackupsSheetController

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

このシナリオで私が目にするほとんどの質問と例は、テーブル ビュー内の項目のカスタム モデル クラスを使用してこれをすべて処理し、一部のコントローラー オブジェクトを応答したいプロパティを変更するためのオブザーバーにします。つまり、各項目は BackupNode オブジェクトのようなものであり、BackupsSheetController はそれぞれのnameプロパティ (または私がそれを何と呼ぶか​​) への変更を監視します。それは私のシナリオでは完全にやり過ぎに思えますが、既に使用しているバインディングを捨てたくないし、これを行う別の方法もありません。setObject:...メッセージを確実に受け取るために、これを行う別の方法はありますか? または、NSArrayController をドロップして、BackupsSheetController をテーブルのデリゲートおよびデータソースにする必要がありますか?

4

1 に答える 1

2

BackupsSheetController「BackupNode」シナリオでは、名前の変更をそれぞれ観察する理由がわかりません。それは物事を行うための非常に回り道です。BackupNode架空のオブジェクトは、プロパティのセッターで必要な作業を行うだけだと思いnameます。

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

接線的な話題についてですが、なぜあなたのウィンドウ コントローラは NIB にあるのでしょうか? NIB をロード (および所有) するものである必要があります。もちろん、NIB がロードされる前に存在する必要があります。つまり、NIB でインスタンス化することはできません。

于 2012-05-01T00:08:36.170 に答える