Проблемы с UINavigationController внутри UITabBarController, viewWillAppear не вызывается - PullRequest
7 голосов
/ 17 июня 2010

В качестве обзора у меня возникают проблемы с UINavigationController внутри UITabBarController, вызывающим viewWillAppear всякий раз, когда представление извлекается из стека.

Из делегата программно создается UITabBarController:

// Create views for Tab Bar
    UINavigationController *view1   = [[UINavigationController alloc] initWithRootViewController:[[newsFeedNavigationController alloc] initWithStyle:UITableViewStylePlain]];
    resizedTabBatItem *tabBarItem1 = [[resizedTabBatItem alloc] initWithTitle:nil image:[UIImage imageNamed:@"newspaper.png"] tag:0];
    [view1 setTabBarItem:tabBarItem1];
    [tabBarItem1 release];

    UIViewController *view2   = [UIViewController new];
    resizedTabBatItem *tabBarItem2 = [[resizedTabBatItem alloc] initWithTitle:nil image:[UIImage imageNamed:@"speechbubble.png"] tag:1];
    [view2 setTabBarItem:tabBarItem2];
    [tabBarItem2 release];

....

// Create the tab bar controller
    bookTabBarController = [BookTabBarController new];
    [[bookTabBarController view] setFrame:CGRectMake(0, 0, 320, 460)];

    // Add the views to it
    NSArray *viewControllers = [NSArray arrayWithObjects:view1, view2, view3, view4, view5, nil];

    [[bookTabBarController tabBarController] setViewControllers:viewControllers];

Мой newsFeedNavigationController - это просто подкласс UITableViewController (и подкласс не мешает viewWillAppear, так как он никогда не вызывается в newsFeedNavigationController). В нем элементы, которые при нажатии будут помещать новый UIViewController в стек.

Проблема в том, что всякий раз, когда представления выталкиваются из стека, viewWillAppear никогда не вызывается в newsFeedNavigationController, а элементы в списке остаются выделенными. Я возился с этим в течение нескольких часов, и теперь мне нужна помощь, чтобы выяснить, что я делаю неправильно.

В моем newsFeedNavigationController я пытался добавить NSLog, чтобы увидеть, вызывается ли он или я что-то сделал, но он никогда даже не вызывается.

- (void)viewWillAppear:(BOOL)animated {
    NSLog(@"is viewWillAppear called?");
    [super viewWillAppear:animated];
}

Изменить:

Хорошо, теперь вот что-то странное, что я заметил:

Если я бегу:

[self presentModalViewController:(any UIview) animated:YES];

и затем отклонить его, viewWillAppear начинает работать должным образом, когда появляются и нажимают представления ... Так что теперь я в тупике. На самом деле это не решение, а, возможно, внутренняя часть того, что происходит.

Ответы [ 5 ]

1 голос
/ 19 сентября 2012

Еще более простой трюк:

В вашем подклассе UITabBarController переопределите это:

-(void)loadView{

    [super loadView];

    //here goes the trick:
    [self setSelectedIndex:1];
    [self setSelectedIndex:0];
}
1 голос
/ 28 июня 2010

Другое решение - установить делегата контроллера навигации.Внутри делегата реализуйте следующий метод:

- (void)navigationController:(UINavigationController *)navigationController  willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
    [viewController viewWillAppear:animated];
}

Это будет гарантировать, что viewWillAppear будет вызываться на любом контроллере представления, представление которого должно появиться в контроллере навигации.Если вы делаете это таким образом, viewWillAppear вызывается независимо от того, появляется ли представление из-за того, что оно выдвигается, или оно появляется из-за выталкивания подпредставления.

1 голос
/ 20 сентября 2010

Решение этой проблемы состоит в том, чтобы UIViewController, содержащий UINavigationController, передавал ему нужные сообщения.UINavigationController будет пересылать сообщения соответствующему контроллеру представления.Это кажется нелогичным, но это работает.

@interface NavigationWrapperViewController : UIViewController {
    // navigationController must be a subview of this view controller's view
    UINavigationController *navigationController;
}
@property (nonatomic, assign) UINavigationController *navigationController;
@end

@implementation NavigationWrapperViewController
@synthesize navigationController;

-(void)viewWillAppear:(BOOL)animated {
    [navigationController viewWillAppear:animated];
}
-(void)viewDidAppear:(BOOL)animated {
    [navigationController viewDidAppear:animated];
}
-(void)viewWillDisappear:(BOOL)animated {
    [navigationController viewWillDisappear:animated];
}
-(void)viewDidDisappear:(BOOL)animated {
    [navigationController viewDidDisappear:animated];
}

@end

Вы можете найти более полное решение по Pastebin (которое я не публиковал).

Благодаря davidbenini.it и jaekwon для этого решения.

1 голос
/ 20 июня 2010

Чтобы ответить на свой вопрос, я выяснил, в чем проблема.

Для того, чтобы придерживаться Apple «Нет UITabBarController внутри UINavigationController», я написал свой собственный контроллер панели вкладок (bookTabBarController), который основан на стандартном View Controller.Моя проблема заключалась в том, что класс не передавал viewDidAppear классу, который управлял контроллерами представления, поэтому он никогда не знал, показывается он или нет.

0 голосов
/ 19 июля 2016

Хорошо, это старый, очень старый, но я оказался здесь с похожей проблемой.

  UITabViewController
     UINavigationController
       UITableViewController1
         UITableViewController2

При выходе из UITableViewController2 функция viewWillAppear в UITableViewController1 никогда не вызывалась.

Проблема: мой UITabViewController пользовательский класс переопределял viewWillAppear без вызова супер реализации.

...