iPhone - 构建代码以避免竞争条件

时间:2010-12-13 02:42:54

标签: iphone uinavigationbar race-condition iad

我有一个iPhone应用程序,它使用UINavigationController,一些表视图和iAd。在顶层,我的导航控制器显示导航栏。在较低的水平,它没有。

我遇到的问题是我的顶级UITableView框架有时会低于屏幕底部。它发生的原因是:

我的viewWillAppear方法如下所示:

-(void) viewWillAppear:(BOOL)animated {
    [self.navigationController setNavigationBarHidden:NO animated: animated]; // changing the last animated to NO does not help.
    [super viewWillAppear:animated];
}

我的viewDidLoad方法如下所示:

- (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];
}

最后,moveBannerViewOffscreen看起来像这样:

-(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设置一些kludge来解决这个问题。但有没有一种干净的方式来组织我的代码,所以问题不会出现在第一位?

由于

1 个答案:

答案 0 :(得分:0)

乍一看(我没有完全理解你的问题,我承认)我怀疑将自己设置为导航控制器的委托以便利用其中一种方法有助于你的时间安排:

navigationController:didShowViewController:animated:

navigationController:willShowViewController:animated:

在调用didShowViewController之前,可能不会移动横幅。

(如果我没有按照你的解释道歉。)