.16 2011

UIKitのアニメーション絡みが痒いです

どうもHAYABUSAです。

久々の投稿ですが、TableView絡みでずっと悩んでた謎がなんとなく解明されてきた感があります。

ざっくりと悩んでた内容は、
「UITableViewをアニメーションありで編集モードを切り替える際、reloadDataを呼ぶとアニメーションがキャンセルされる」
という謎です。(performSelectorディレイでreloadDataなんて付け焼き刃なことはしません(^^;)
- (void)setEditing:(BOOL)editing animated:(BOOL)animated
のanimatedをYESで編集モードに移行するパターンですね。

例えばTableViewのセル内にUISwitchとか配置してカスタムしたいときってありますよね?
んで編集モードがONかOFFかでそれらのコントロールを表示/非表示させたいときもあると思います。
そういったとき今までは、UITableViewのデリゲートメソッド
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
内で直接セルにUISwitchを配置したり、Editモードか否かでの表示ON/OFFとかの制御をすべてやっちゃってたんです。
でもそうしちゃうと、このデリゲートメソッドがコールバックされる=reloadDataをコールしないと制御できなくなるんですよね…

調査した結果どうやら、
- (void)setEditing:(BOOL)editing animated:(BOOL)animated
メソッドは、
1) UIViewController
2) UITableView
3) UITableViewCell
の3クラスに用意されていて、それぞれ上記の順番でコールされるようです。
とくにUITableViewControllerでビューコントローラを作ってる場合なんかは知っておくと便利かもです。

なので今回のケースとしては、
3) UITableViewCell
のサブクラスを作り、オーバーライドしたsetEditingメソッド内で編集モード状態でのコントロール制御をやってあげることで解決しました。
コントロールの表示/非表示はもちろん、アニメーションも思うがままなので、編集モードになったらUISwitchがスライドしながら消える、といったようなアニメーションもできちゃいます。
わざわざセルをサブクラス化するのが面倒だったために遠回りしちゃってたんですね…orz

テーブルの最下行に新規追加用セルを入れたいときなんかも、面倒でもビューコントローラのsetEditing内で、insertRows/deleteRowsをやってあげるのが正解です。

最後に、今辿り着いた答えとしては、「編集モードを切り替える際にreloadDataをしないといけないような処理/制御はやっちゃいけない(!?)」
…現状はまだ、!?の段階ですが、今後も実装しながらいい具合のコーディングスタイルを確立していこうと思います。

しかしTableView…癖が強い(;´Д`
関連記事
スポンサーサイト



Comment

Post comment

  • comment
  • secret
  • 管理者にだけ表示を許可する

Trackback

trackbackURL:http://appteam.blog114.fc2.com/tb.php/212-5eeae697

ブログ内検索

関連リンク

製品情報

最新記事

カテゴリ

プロフィール

neoxneo



NEXT-SYSTEM iOS Developers Blog


  • UTO:
    カナダ版iPhone4Sは、マナーモードでシャッター音がならない…


  • Ehara:
    ...


  • Hayate:
    ...


  • Tasaki:
    Developer登録完了...したのはいいけど


  • Ueda:
    ...



リンク