iOS5 では UIViewController.parentViewController が nil

2011年10月17日月曜日 | Published in | 4 コメント

このエントリーをはてなブックマークに追加

(2011-10-18追記)その後の調査で、下記のことがわかった。

  • Xcode 4.1 でビルドしたアプリを iOS5 で動作させても現象はでない
  • Xcode 4.2 でビルドしたアプリを iOS5 で動作させると現象が出る


iOS 5.0 から UIViewController.parentViewController が親の UIViewController を返さなくなった。手元のプログラムで iOS4.3 までは入っていたこのプロパティが、iOS 5.0 では nil になっていた。親は UITabBarController。
/*
If this view controller is a child of a containing view controller (e.g. a navigation controller 
or tab bar controller,) this is the containing view controller.  Note that as of 5.0 this no 
longer will return the presenting view controller.
*/
@property(nonatomic,readonly) UIViewController *parentViewController;

5.0 では新しく追加された presentingViewController を使う。
// The view controller that was presented by this view controller
  or its nearest ancestor.
@property(nonatomic,readonly) UIViewController *presentedViewController  
    __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_5_0);

presentModalViewController で表示された ViewController が自分自身を閉じる場合、例えば iOS4.3 までだと下記のようなコードが書けた。
[self.parentViewController dismissModalViewControllerAnimated:YES];

iOS 5 の場合、parentViewController が nil になるので代わりに presentingViewController を使う。両バージョンで動作させる場合はこんな感じ。
if ([selfrespondsToSelector:@selector(presentingViewController)]) {
        [self.presentingViewControllerdismissModalViewControllerAnimated:YES];        
} else {
        [self.parentViewControllerdismissModalViewControllerAnimated:YES];
}

他にはこんなのもある。
// The view controller that was presented by this view controller
 or its nearest ancestor.
@property(nonatomic,readonly) UIViewController *presentedViewController  
    __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_5_0);

Responses

  1. KatokichiSoft says:
    2011年10月17日 12:41

    私が見つけたものでは、タブ移動をしているときのviewWillAppearとviewWillDisappearが呼ばれる順がiOS4と逆になっていました。
    iOS4以前だとviewWillDisappear→viewWillAppearでしたが、iOS5だとviewWillAppear→viewWillDisappearに。

    なかなかに厄介ですね。

  2. KatokichiSoft says:
    2011年10月17日 12:41

    私が見つけたものでは、タブ移動をしているときのviewWillAppearとviewWillDisappearが呼ばれる順がiOS4と逆になっていました。
    iOS4以前だとviewWillDisappear→viewWillAppearでしたが、iOS5だとviewWillAppear→viewWillDisappearに。

    なかなかに厄介ですね。

  3. xcatsan says:
    2011年10月17日 13:08

    KatokichiSoft さん、こんにちは。

    > OS5だとviewWillAppear→viewWillDisappearに。

    うーむ、そうなんですか。
    こういうのは気が付きにくいので厄介ですね。

    情報どうも。

  4. xcatsan says:
    2011年10月17日 13:08

    KatokichiSoft さん、こんにちは。

    > OS5だとviewWillAppear→viewWillDisappearに。

    うーむ、そうなんですか。
    こういうのは気が付きにくいので厄介ですね。

    情報どうも。

  5. KatokichiSoft says:
    2011年10月17日 14:12

    はい、ビューコントローラ間でデリゲートを使うデータを使い回していて、willDisappearでデリゲートをnilに設定、viewWillAppearで自分(=新しい画面)を設定するようにしていました。
    その結果、iOS5ではデリゲートがnilになってしまうという問題が発生してしまった次第です。

  6. KatokichiSoft says:
    2011年10月17日 14:12

    はい、ビューコントローラ間でデリゲートを使うデータを使い回していて、willDisappearでデリゲートをnilに設定、viewWillAppearで自分(=新しい画面)を設定するようにしていました。
    その結果、iOS5ではデリゲートがnilになってしまうという問題が発生してしまった次第です。

  7. xcatsan says:
    2011年10月17日 16:04

    なるほど。確かに順番を当てにした処理は私も書くことがあります。
    なんだか自分が作ったアプリで該当する箇所が気になってきました。。

    情報ありがとうございました。

  8. xcatsan says:
    2011年10月17日 16:04

    なるほど。確かに順番を当てにした処理は私も書くことがあります。
    なんだか自分が作ったアプリで該当する箇所が気になってきました。。

    情報ありがとうございました。

Leave a Response

人気の投稿(過去 30日間)