iPhone——构造代码以避免竞争条件

iPhone——构造代码以避免竞争条件,iphone,uinavigationbar,race-condition,iad,Iphone,Uinavigationbar,Race Condition,Iad,我有一个iPhone应用程序,它使用UINavigationController、一些表视图和iAd。在顶层,“我的导航控制器”显示导航栏。在较低的层面上,情况并非如此 我遇到的问题是,有时我的顶级UITableView的框架位于屏幕底部以下。发生这种情况的原因是: 我的ViewWillAppeard方法如下所示: -(void) viewWillAppear:(BOOL)animated { [self.navigationController setNavigationBarHidd

我有一个iPhone应用程序,它使用UINavigationController、一些表视图和iAd。在顶层,“我的导航控制器”显示导航栏。在较低的层面上,情况并非如此

我遇到的问题是,有时我的顶级UITableView的框架位于屏幕底部以下。发生这种情况的原因是:

我的ViewWillAppeard方法如下所示:

-(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时,视图的大小已调整为导航栏的大小。谢谢