Obj.C

obj.C:悲しくなってしまった identifier

ファイルやフォルダの削除機能を追加していました。想定よりもコード量が多く、ロジックがむずかしいでした。

フォルダを削除すると、該当する表のファイル情報も連携して削除する必要があります。また、削除後にどのファイルを表示するかの処理も入れないといけません。そんなこんなで、手間取っていました。

削除処理は正常に終わっているはずなのに、表の範囲外の行(row/column)をアクセスしているというエラーで落ちてしまうのです。どのように調べればいいか、全く見当がつかなかったので何回もロジックを見直したのですが、問題の箇所は見つかりません。

ようやく思いついたのは、本当に削除処理が正常終了しているか調べるログを入れることでした。それで、やってみると、全くOKです。

次に表のコントロールをしているところに片っ端からログを入れ、ようやく-(void)tableView:(NSTableCellView *)tableView //
setObjectValue:(id)object forTableColumn:(NSTableColumn *)column row:(NSInteger)rowで落ちていることがわかりました。

悲しかったことは、カラムのidentifierをsetするにはどうしたらいいか調べたときの残骸がここに残っていたことです。これはこれで調べないといけないのですが、残骸は実にまずいでした。

良かったことは、このエラーを調べているとき、表の行(row)の選択解除と選択の仕方がわかったことです。この選択が問題なのかなあと疑いを持って調べたのですが、そうではありませんでした。そんなはずはありませんよね。

表の行選択解除の仕方
表記:- (void)deselectRow:(NSInteger)rowIndex
用例:
IBOutlet NSTableView *tableView;
NSInteger row = [tableView clickedRow];
[tableView deselectRow:row];

表の行選択の仕方
表記:- (void)selectRowIndexes:(NSIndexSet *)indexes byExtendingSelection:(BOOL)extend
用例:
IBOutlet NSTableView *tableView;
NSInteger mcRow = 2;
[tableView selectRowIndexes:[NSIndexSet indexSetWithIndex:mcRow] byExtendingSelection:NO];

メモ:

  • いまひとつ調べないといけないことは、表の行削除をメイン側に実装しないとNGだったことです。
    ➡これは勘違いです。NSInteger row = [tableView selectedRow]; を削除して、メイン側と同じアルゴリズムにしたら、OKになりました。
  • NSInteger row = [tableView selectedRow]; については、文字通り、現在選択されている行をgetするというもので、必ずしも行削除に紐づいているものではありませんでした。サンプルプログラムでは、選択行を削除する実装になっていたというに過ぎません。
  • ソースコードはsaveとcopyを作りながら更新しています。しかし、手順をまちがってしまい、その修復もやっていました。ちょっとしたことですが、基本的なことがきちんとできないと、余計な後戻りが発生してしまいます。100%は無理でも、90%は・・・。
  • もしかすると少し重要。フォルダを削除すると、当然、その中に入っているファイルも削除されます。そして、これらに対応する表中のフォルダ情報、ファイル情報も削除しないといけません。最初、表の上側から削除していたのですが、行数([tableView count]が削除の度に変わってしまうので、どうもうまくありません。
    それで、表の最後から同じフォルダの中のファイルの行だけを探して、上側にフォルダの行位置まで消していくようにしました。

IMG_3221

 

 

Categories: Obj.C, 技術

Tagged as: ,