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