XCode 4.5.x & SDK 6 にぶつかって以来、私たちの iOS アプリ (iPhone) に奇妙な問題があります。問題は、View Controller がほとんどの場合表示されることですが、表示されないこともあります。すべてのケースでviewDidLoad
,viewWillAppear
およびviewDidAppear
デリゲート メソッドが呼び出されることを確認しましたが、それはビューが表示されるかどうかに影響を与えないようです。
BroadcastOptionsViewController *tmpView = [[BroadcastOptionsViewController alloc] init];
[self.navigationController pushViewController:tmpView animated:YES];
このView Controllerを複数の場所から呼び出します(アプリはaを使用しUITabBarController
、このコードは2つの異なるタブから呼び出され、両方に独自のナビゲーションコントローラーがあります)、これが行われるパスに関係なくエラーが発生するようです。 View Controller自体、またはおそらくメモリの破損が疑われます。
複数のデバイス (iOS 5.x および 6、iPhone 4/3GS、iPod touch) でアプリをテストしたところ、かなりランダムに発生するようです (たとえば、「コールド スタート」後やアプリをしばらく使用した後など)。
最後に、以前はBroadcastOptionsViewController
を a のサブクラスにしていましたUITableViewController
。UIViewController
にして、メンバーを使用するという提案がありましたUITableView
。これで問題の発生は減ったように見えますが、まだ解決していません。
編集:
以前は、このビュー コントローラー用の XIB (使用されていません) がありましたが、削除されました。XCode を閉じ、デバイスからアプリを削除し、~/Library/Developer/XCode/DerivedData/*
(明らかに XCode 4+ の既知のバグ) をクリアしました。
リクエストに応じて、さらにいくつかのコードを次に示します。
-(id) init {
NSLog(@"BroadcastOptionsViewController:init");
self = [super init];
if (self) {
// Some scalar members initialized
}
return self;
}
-(void) viewDidLoad {
NSLog(@"BroadcastOptionsViewController:viewDidLoad");
[super viewDidLoad];
int navBarHeight = self.navigationController.navigationBar.frame.size.height;
tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 320, self.view.bounds.size.height) style:UITableViewStyleGrouped];
[tableView setFrame:CGRectMake(0, 0, 320, self.view.bounds.size.height - navBarHeight)];
[tableView setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"background.png"]]];
[tableView setDelegate:self];
[tableView setDataSource:self];
[tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];
[self.view addSubview:tableView];
self.title = NSLocalizedString(@"Title", nil);
self.navigationController.navigationBar.tintColor = [LookAndFeel defaultColor];
tableView.allowsSelection = YES;
UIBarButtonItem *btn_cancel = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(cancel)];
self.navigationItem.leftBarButtonItem = btn_cancel;
[btn_cancel release];
UIBarButtonItem *btn_action =
[[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"Go", nil)
style:UIBarButtonSystemItemDone
target:self
action:@selector(doAction)];
self.navigationItem.rightBarButtonItem = btn_action;
[btn_action release];
}
-(void) viewWillAppear:(BOOL) animated {
NSLog(@"BroadcastOptionsViewController:viewWillAppear");
[super viewWillAppear:animated];
[[UIApplication sharedApplication] setStatusBarHidden:NO];
// WORKAROUND: Navigation bar hiding below status bar
[self.navigationController setNavigationBarHidden:YES animated:NO];
[self.navigationController setNavigationBarHidden:NO animated:NO];
// Events
[self subscribeToApplicationEvents];
}
-(void) viewDidAppear:(BOOL)animated {
NSLog(@"BroadcastOptionsViewController:viewDidAppear");
// Always properly called, independent of whether view actually appears
}