A view can only be associated with at most one view controller at a time!

SPECIAL


実行時に UIViewController 周りのエラーで強制終了する

制作中の iPhone アプリを実行したところ、次のエラーでアプリが強制終了してしまうことがありました。

 *** Terminating app due to uncaught exception 'UIViewControllerHierarchyInconsistency', reason: 'A view can only be associated with at most one view controller at a time! View <UIView: 0x75724a0; frame = (0 20; 320 460); autoresize = W+H; layer = <CALayer: 0x7572500>> is associated with <UIViewController: 0x7572030>. Clear this association before associating this view with <EzSampleViewController: 0x7570c70>.'

少し長いエラーメッセージですけど、注目したいところは "A view can only be associated with at most one view controller at a time!" というところです。

そして、これはどうやら、ひとつの UIView が、ふたつの UIViewController の直接の支配下にあることが原因だったみたいです。

 

たとえば UIViewController で次のようなコードを記載した場合に、このようなエラーが表示されます。

- (void)viewDidLoad

{

[super viewDidLoad];

 

UIViewController* viewController = [[UIViewController alloc] init];

self.view = viewController.view;

}

この場合、生成した UIViewController が管理している view を、自分自身の UIViewController でも管理しようとしたために、エラーとなってしまいました。

 

これを回避するためには、次のように、UIViewController ではなく UIView を直接生成して設定してあげる必要があります。

- (void)viewDidLoad

{

[super viewDidLoad];

 

UIView* view = [[UIView alloc] init];

self.view = view;

}

どうしても UIViewController を介して生成した UIView でないと都合が悪いときには、次のような方法も可能なようです。

- (void)viewDidLoad

{

[super viewDidLoad];

 

UIViewController* viewController = [[UIViewController alloc] init];

UIView* view = viewController.view;

 

viewController.view = nil;

self.view = view;

}

これらのように、ある UIViewController のルートビューとして UIView を設定するときには、その UIView が他の UIViewController に所属していないようにする必要があります。