3

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 のサブクラスにしていましたUITableViewControllerUIViewControllerにして、メンバーを使用するという提案がありました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
}
4

0 に答える 0