3

自从我们遇到 XCode 4.5.x 和 SDK 6 以来,我的 iOS 应用程序 (iPhone) 出现了一个奇怪的问题。问题是视图控制器大部分时间都显示,但有时不显示。我已经检查过在所有情况下都调用了viewDidLoad,viewWillAppearviewDidAppear委托方法,但这似乎并不影响视图是否显示。

BroadcastOptionsViewController *tmpView = [[BroadcastOptionsViewController alloc] init]; 
[self.navigationController pushViewController:tmpView animated:YES];

我们从多个地方调用这个视图控制器(应用程序使用 aUITabBarController并且这段代码是从两个不同的选项卡调用的,它们都有自己的导航控制器)并且无论通过哪个路径完成,错误似乎都会表现出来,这导致我怀疑视图控制器本身,或者可能是内存损坏。

我们已经在多个设备(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
}
4

0 回答 0