是否有可能推视图控制器与完成块?

UINavigationController的文档不包含带有completion:参数的pushViewController方法。

我会用@ justMartin的答案去。 但下面是另一种方法。

推动animation需要0.3秒。所以,如果你想在这里运行一些函数,在延迟0.3秒后使用performSelector。

 [self performSelector:@selector(completedPushing:) withObject:nil afterDelay:.3]; 

要么
在将new viewController推入navigation stackold viewController view将从视图层次结构中移除。这会导致在旧的ViewController上调用viewDidDisappear 。您可以在其中编写completion代码。 不要忘记在viewDidDisappear的某个实现点上调用super

更好的解决scheme是通过CATransaction包装推动animation并设置completionBlock。 没有必要处理时间。

 [CATransaction begin]; [[self navigationController] pushViewController:viewController animated:YES]; [CATransaction setCompletionBlock:^{ //whatever you want to do after the push }]; [CATransaction commit]; 

不知道我是否理解正确,但我推动视图控制器在一个完成块如下。 在表格视图控制器中,将以下行添加到头文件中:

 typedef void(^myCompletion)(BOOL); 

然后在课堂上join以下方法:

 -(void) myMethod:(myCompletion) compblock { compblock(YES); } 

现在在didSelectRowAtIndexPath ,我调用了myMethod并在完成块中推入了一个视图控制器。

 [self myMethod:^(BOOL finished) { if(finished){ dispatch_async(dispatch_get_main_queue(), ^{ DVSecondTableViewController *vc = [[DVSecondTableViewController alloc] init]; [self.navigationController pushViewController:vc animated:YES]; }); } }]; 

我不知道是否可以将视图控制器推到主线程之外,所以我将这个调用embedded到dispatch_async()

马丁的答案对我很好。 对于那些使用Swift API的新手来说:

 CATransaction.begin() self.navigationController?.pushViewController(viewController, animated: true) CATransaction.setCompletionBlock({ //your post animation logic }) CATransaction.commit()