是否有可能推视图控制器与完成块?
UINavigationController的文档不包含带有completion:
参数的pushViewController
方法。
我会用@ justMartin的答案去。 但下面是另一种方法。
推动animation需要0.3秒。所以,如果你想在这里运行一些函数,在延迟0.3秒后使用performSelector。
[self performSelector:@selector(completedPushing:) withObject:nil afterDelay:.3];
要么
在将new viewController
推入navigation stack
, old 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()