Код структурирования iPhone во избежание состояния гонки

У меня есть приложение для 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, чтобы настроить некоторый кладж, чтобы исправить это. Но есть ли чистый способ организовать мой код, чтобы проблема не возникала вообще?

Спасибо


person William Jockusch    schedule 13.12.2010    source источник


Ответы (1)


На первый взгляд (я признаю, не полностью понимая вашу проблему), я подозреваю, что установка себя в качестве делегата контроллера навигации, чтобы воспользоваться одним из этих методов, поможет вам с расчетом времени:

navigationController:didShowViewController:animated:

navigationController:willShowViewController:animated:

возможно, не перемещать свой баннер, пока не будет вызван didShowViewController.

(Прошу прощения, если я не последовал вашему объяснению.)

person Matthew Frederick    schedule 13.12.2010
comment
Кажется, это решает проблему, хотя на всякий случай я установил BOOL, чтобы отслеживать, должен ли баннер быть видимым, и направил методы появления / исчезновения моего представления баннера с помощью метода, который проверял значение этого BOOL. Но главное есть. . . во время вызова didShowViewContoller размер представления был скорректирован с учетом панели навигации. Спасибо. - person William Jockusch; 13.12.2010