2010年4月21日水曜日

自前でNSIndexPathを生成する

UITableViewで、現在の行の次の行や前の行を参照したい場合、NSIndexPathを自分で生成しないといけないのだろうなと思いつくわけですが、さてどうしたもんか。

調べると、こうすればよいという情報がそこここにあります。

NSIndexPath newPath = [NSIndexPath indexPathForRow:3 inSection:1];

この場合、2番目のセクションの4行目を表すNSIndexPath が出来ます。出来ますが。

indexなどと始まる名前のクラスメソッドの常で、これはファクトリクラスメソッドで、生成するインスタンスに対して内部でautoreleaseしてます。イベントなどでなんども発生するようなメソッド内で書くと、あっという間にメモリを食ってしまいます。なのでちゃんと自分でオーナーシップを握るようにしないといけません。

そもそもNSIndexPathって何だろうって話なのですが、一番判りやすい説明は「アウトライン上の位置情報」でした。

  • 1章
    • 1-1節
    • 1-2節
      • 1-2-3項
    • 1-3節
  • 2章
    • 2-1節 #いまここ
    • 2-2節

以下略

このいまここ、がNSIndexPath。階層は任意で決められます。UITableViewのDataSourceやDelegateのメソッドで扱ってるものは、UITableView用にカテゴリで拡張したもので、階層は2階層で固定、それぞれを表すsectionとrowというプロパティが追加されています。

なので自前で作るときはこうなります。

NSUInteger newIndex[] = {1, 3}; // 2番目のセクションの4行目
NSIndexPath newPath = [NSIndexPath alloc] initWithIndexes:newIndex length:2];
//ああだこうだの処理
[newPath release];

length: が階層ですね。これで自分でお掃除も出来ます。どうせならUITableView用に特化したイニシャライザも作ってくれればよかったのに。上の処理をラップすりゃ出来るんだし。

0 件のコメント:

コメントを投稿