私の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をテーブルのデリゲートとデータソースにする必要がありますか?
接尾辞:nibの所有者は、nibからロードしてシートとして提示するNSDocumentサブクラスです。 'コントローラ'オブジェクトは、シートのアクションを処理し、そのオブジェクトにバインドし、ドキュメントサブクラスからそのアイテムを保持するために存在し、かなり大きくなります。確かにそこに他のアイデアにオープン! –
>「とにかく、適切なモデルオブジェクトを使用することをおすすめします。 あなたと私の両方、私はちょうどモデルとしてバックアップを考えていなかった、私は鈍っていた、私は仮定する;-) –