2009-05-24汎用性を高める工夫データソースの汎用性を高めるモデルオブジェクトのクラス名を直接ソースコードに記述しない事でNVKTableViewの汎用性を高める事ができました。同じ事をDragDropDataSourceクラスに適用すれば、同様に汎用性を高める事ができるので実行します。クラス名をNVKDragDropDataSourceとします。爆発アニメーションのデリゲートメソッドを追加します。NVKDragDropDataSourceのインターフェイスファイルインターフェイスファイルの変更点はクラス名のみです。*selectionIndexes,*oldSelectionIndexes;}@endインプリメンテーションファイルの変更点DragDropDataSourceとの違いを赤字で示しながら説明していきます。Lissajous.hをインポートしていた部分がNVKPasteboardSupportプロトコルを定義するヘッダファイルに置き換わりました。モデルクラスはこのプロトコルを採用している事が前提となります。Lissajous.h経由でRMGRoot.hをインポートしなくなったので、UNDO_MANAGERマクロの定義を取り消す必要がなくなりました。よって#undef文を削除しています。管理対象オブジェクトコンテキストへのアクセスを容易にするためにMOCマクロを追加しました。行番号情報のデータタイプを表す文字列とグローバル変数の接頭詞をRMGからNVKに変更しました。配列コントローラに設定されているエンティティ名に対応するクラスのクラスオブジェクトを返すtargetClassメソッドを追加しました。これはNVKTableViewと同じメソッドです。managedObjectClassName]);}初期化メソッド、アクセサメソッド、ユーティリティメソッドawakeFromNibメソッドにターゲットとなるモデルクラスがNVKPasteboardSupportを採用しているかどうかをチェックするコードを追加しました。していない場合はエラーメッセージを出力するので、デバッグの際に役立つでしょう。deallocメソッドは変更なしです。アクセサメソッドとユーティリティメソッドも変更ありません。setActionName:NSLocalizedString(actionName,nil)];}管理対象オブジェクトが追加、削除された時の並べ替え通知を受けて管理対象オブジェクトの順番を並べ直す際の処理ですが、これまでは順序を表す属性を@"order"と固定の文字列で直接指定していました。これをクラスメソッドorderKeyを使って得た文字列を使う様に変更します。追加と削除のアクション名をターゲットクラスのクラスメソッドを使って得る様に変更します。deleteActionName]];}}データソースのメソッド以下の点を変更しています。targetClass]に変更した。RMGRowsTypeをNVKRowsTypeに変更した。アクション名を固定文字列からターゲットクラスのクラスメソッドに変更した。@"order"をターゲットクラスのorderKeyメソッドに変更した。orderアクセサメソッドの呼び出しをvalueForKey:orderKeyに変更した。NO;}爆発アニメーション終了時の削除処理テーブルビューのアイテムがドラッグされてドロップを受け入れられない場所でリリースされた場合、爆発アニメーションが表示された後にデータソースにanimationEffectDidEnd:メッセージが送られてきます。データソースはドラッグされたアイテムを削除する処理を実行する必要があります。このメソッドでは以下の処理を行なっています。ドラッグ用ペーストボードから行番号情報を取り出す。行番号情報からドラッグされた管理対象オブジェクトを特定する。特定した管理対象オブジェクトを管理対象オブジェクトコンテキストから削除する。アンドゥマネージャにアクション名を設定する。管理対象オブジェクトコンテキストに未処理のまま残っている変更点を更新する5を実行しないと削除されるのにかなり時間がかかります。この解決策がなかなかわかりませんでした。