アプリが次のエラーで読み込まれたときに (iOS 6 でのみ) クラッシュしていたアプリがあります。
Application windows are expected to have a root view controller at the end of application launch
*** Terminating app due to uncaught exception 'UIViewControllerHierarchyInconsistency', reason: 'A view can only be associated with at most one view controller at a time!
View <UITableView: 0xc21a800; frame = (0 20; 320 460); clipsToBounds = YES; opaque = NO; autoresize = W+H; gestureRecognizers = <NSArray: 0xbfb9d50>; layer = <CALayer: 0xbfb9720>; contentOffset: {0, 0}> is associated with <RootViewController: 0xbfbbb40>. Clear this association before associating this view with <RootViewController: 0xbfac010>.'
私の applicationDidFinishLaunchingWithOptions は次のようになります。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.backgroundColor = [UIColor whiteColor];
// Add root nav controller below everything else
RootViewController *rootViewController = [[RootViewController alloc] initWithStyle:UITableViewStyleGrouped];
rootViewController.title = @"My App";
NSArray *sectionNames = [NSArray arrayWithObjects:@"Sec 1", @"Sec 2", @"Sec 3", nil];
rootViewController.sectionNames = sectionNames;
UINavigationController *aNavigationController = [[UINavigationController alloc] initWithRootViewController:rootViewController];
self.navigationController = aNavigationController;
if ([self.window respondsToSelector:@selector(setRootViewController:)]) {
self.window.rootViewController = aNavigationController;
} else {
[self.window addSubview:aNavigationController.view];
}
// Add fake loading image
NSString* imageName = @"Default-Portrait.png";
theImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:imageName]];
theImageView.frame = CGRectMake(0,0,320,480);
[self.window addSubview:theImageView];
return YES;
}
RootViewController は UITableViewController の単なるサブクラスであり、これ以外に興味深いものはありません:
- (void)viewDidLoad {
[super viewDidLoad];
self.tableView.delegate = self;
self.tableView.allowsSelection = YES;
self.userDefaults = [NSUserDefaults standardUserDefaults];
}
.xib ファイルがありますが、初期化に使用していません。このエラーは、そのファイルが存在するかどうかに関係なく発生します。
驚いたことに、これを RootViewController に追加すると、エラーはなくなります。
- (void)loadView {
[super loadView];
}
問題を解決するのは [super loadView] であり、私はそれを呼び出すべきではありません。どうして??