【问题标题】:iPhone -- structuring code to avoid a race conditioniPhone——结构化代码以避免竞争条件
【发布时间】:2010-12-13 02:42:54
【问题描述】:

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

我遇到的问题是,有时我的顶级 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 时仍然如此。所以table view的高度设置为480。当导航栏进来的时候,结果是table view的底部在屏幕下方,用户无法选择最后一行。

我确信我可以使用 NSTimer 来设置一些 kludge 来解决这个问题。但是有没有一种干净的方法来组织我的代码,这样问题就不会首先出现?

谢谢

【问题讨论】:

    标签: iphone uinavigationbar race-condition iad


    【解决方案1】:

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

    navigationController:didShowViewController:animated:
    
    navigationController:willShowViewController:animated:
    

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

    (抱歉,如果我没有听从您的解释。)

    【讨论】:

    • 似乎解决了问题,但为了安全起见,我设置了一个 BOOL 来跟踪横幅是否应该可见,并通过检查的方法路由我的横幅视图出现/消失方法该 BOOL 的值。但主要的是。 . .在调用 didShowViewContoller 时,已调整视图的大小以适应导航栏。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2015-01-30
    • 2010-09-25
    • 1970-01-01
    • 2010-09-25
    • 2019-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多