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 に所属していないようにする必要があります。