didShowViewController在viewDidAppear之后没有被调用

我在自定义导航控制器子类上使用UINavigationController委托方法来提供特殊的UI行为。 不幸的是,在某些情况下,即使该视图变为可见,我也没有在推送视图后收到didShowViewControllercallback。

我正在接收一些委托调用,大部分情况下工作正常 – 只有在我的应用程序中使用特定的View控制器才能看到这种行为。

因此,在创build了一些testing之后,我发现问题可能是由didAppear或者willAppear方法提供了另一个视图控制器造成的。 后者似乎很好,但缺less调用didShowViewController后viewDidAppear似乎像一个错误给我。

为了避免这个问题,您可以在UINavigationController的子类中创build一个完成块,以便推送视图控制器,并且只有在完成推送后才启动您的推送视图控制器。 类似的东西可能是: UINavigationController“pushViewController:animated”的完成处理程序?

例如(警告!未经testing):

@interface PbNavigationController : UINavigationController <UINavigationControllerDelegate> @property (nonatomic,copy) dispatch_block_t completionBlock; @property (nonatomic,strong) UIViewController * pushedVC; @end @implementation PbNavigationController - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { self.delegate = self; } return self; } - (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated { NSLog(@"didShowViewController:%@", viewController); if (self.completionBlock && self.pushedVC == viewController) { self.completionBlock(); } self.completionBlock = nil; self.pushedVC = nil; } -(void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated { if (self.pushedVC != viewController) { self.pushedVC = nil; self.completionBlock = nil; } } -(void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated completion:(dispatch_block_t)completion { self.pushedVC = viewController; self.completionBlock = completion; [self pushViewController:viewController animated:animated]; } @end 

你可能可以做更多的同步完成块和pushVC ….