iPhone——构造代码以避免竞争条件
我有一个iPhone应用程序,它使用UINavigationController、一些表视图和iAd。在顶层,“我的导航控制器”显示导航栏。在较低的层面上,情况并非如此 我遇到的问题是,有时我的顶级UITableView的框架位于屏幕底部以下。发生这种情况的原因是: 我的ViewWillAppeard方法如下所示:iPhone——构造代码以避免竞争条件,iphone,uinavigationbar,race-condition,iad,Iphone,Uinavigationbar,Race Condition,Iad,我有一个iPhone应用程序,它使用UINavigationController、一些表视图和iAd。在顶层,“我的导航控制器”显示导航栏。在较低的层面上,情况并非如此 我遇到的问题是,有时我的顶级UITableView的框架位于屏幕底部以下。发生这种情况的原因是: 我的ViewWillAppeard方法如下所示: -(void) viewWillAppear:(BOOL)animated { [self.navigationController setNavigationBarHidd
-(void) viewWillAppear:(BOOL)animated {
[self.navigationController setNavigationBarHidden:NO animated: animated]; // changing the last animated to NO does not help.
[super viewWillAppear:animated];
}
- (void)viewDidLoad {
[self.navigationController setNavigationBarHidden:NO animated: NO];
[super viewDidLoad];
[self createTableView];
ADBannerView *abv = [[ADBannerView alloc]initWithFrame: [self initialBannerViewFrame]];
abv.delegate=self;
[self.view addSubview:abv];
self.bannerView = abv;
[self moveBannerViewOffscreen];
[abv release];
}
-(void) moveBannerViewOffscreen {
// moving it down and off
CGRect newBannerFrame = self.bannerView.frame;
CGFloat screenHeight = [[UIScreen mainScreen]bounds].size.height;
newBannerFrame.origin.y=screenHeight;
bannerView.frame = newBannerFrame;
CGRect newTableFrame = self.selectionTableView.frame;
newTableFrame.size.height = self.view.bounds.size.height;
self.selectionTableView.frame = newTableFrame;
}
我的viewDidLoad方法如下所示:
-(void) viewWillAppear:(BOOL)animated {
[self.navigationController setNavigationBarHidden:NO animated: animated]; // changing the last animated to NO does not help.
[super viewWillAppear:animated];
}
- (void)viewDidLoad {
[self.navigationController setNavigationBarHidden:NO animated: NO];
[super viewDidLoad];
[self createTableView];
ADBannerView *abv = [[ADBannerView alloc]initWithFrame: [self initialBannerViewFrame]];
abv.delegate=self;
[self.view addSubview:abv];
self.bannerView = abv;
[self moveBannerViewOffscreen];
[abv release];
}
-(void) moveBannerViewOffscreen {
// moving it down and off
CGRect newBannerFrame = self.bannerView.frame;
CGFloat screenHeight = [[UIScreen mainScreen]bounds].size.height;
newBannerFrame.origin.y=screenHeight;
bannerView.frame = newBannerFrame;
CGRect newTableFrame = self.selectionTableView.frame;
newTableFrame.size.height = self.view.bounds.size.height;
self.selectionTableView.frame = newTableFrame;
}
最后,moveBannerViewOffscreen如下所示:
-(void) viewWillAppear:(BOOL)animated {
[self.navigationController setNavigationBarHidden:NO animated: animated]; // changing the last animated to NO does not help.
[super viewWillAppear:animated];
}
- (void)viewDidLoad {
[self.navigationController setNavigationBarHidden:NO animated: NO];
[super viewDidLoad];
[self createTableView];
ADBannerView *abv = [[ADBannerView alloc]initWithFrame: [self initialBannerViewFrame]];
abv.delegate=self;
[self.view addSubview:abv];
self.bannerView = abv;
[self moveBannerViewOffscreen];
[abv release];
}
-(void) moveBannerViewOffscreen {
// moving it down and off
CGRect newBannerFrame = self.bannerView.frame;
CGFloat screenHeight = [[UIScreen mainScreen]bounds].size.height;
newBannerFrame.origin.y=screenHeight;
bannerView.frame = newBannerFrame;
CGRect newTableFrame = self.selectionTableView.frame;
newTableFrame.size.height = self.view.bounds.size.height;
self.selectionTableView.frame = newTableFrame;
}
加载视图时,即使我调用了
[self.navigationController setNavigationBarHidden: NO animated: NO];
“我的视图”的框架不会立即调整以适应导航栏。执行moveBannerViewOffscreen时仍然如此。因此,表视图的高度设置为480。当导航栏进入时,结果是表格视图的底部在屏幕下方,用户无法选择最后一行
我相信我可以使用NSTimer来设置一些乱七八糟的问题来解决这个问题。但是有没有一种干净的方法来组织我的代码,这样问题就不会首先出现
感谢乍一看(我承认没有完全理解您的问题),我怀疑将您自己设置为导航控制器的代表,以便利用以下方法之一将有助于您的计时:
navigationController:didShowViewController:animated:
navigationController:willShowViewController:animated:
在调用didShowViewController
之前,可能不会移动您的横幅
(如果我没有按照您的解释进行操作,很抱歉。)似乎解决了问题,但为了安全起见,我设置了一个BOOL来跟踪横幅是否应该可见,并通过一个检查该BOOL值的方法来路由我的横幅视图“显示/消失”方法。但最重要的是。在调用DidShowViewController时,视图的大小已调整为导航栏的大小。谢谢