UINavigationControllerのドキュメントには、pushViewController
メソッドとcompletion:
パラメータ。
より良い解決策は、プッシュアニメーションをCATransactionでラップし、completionBlockを設定することです。タイミングを扱う必要はありません。
[CATransaction begin];
[CATransaction setCompletionBlock:^{
//whatever you want to do after the Push
}];
[[self navigationController] pushViewController:viewController animated:YES];
[CATransaction commit];
justMartinの答えは私にとって素晴らしいものでした。 Swift APIを初めて使用する場合:
CATransaction.begin()
navigationController?.pushViewController(viewController, animated: true)
CATransaction.setCompletionBlock({
//your post animation logic
})
CATransaction.commit()
CATransaction
を使用したソリューションは素晴らしいですが、それを行う別の方法があります。コントローラをUINavigationController
のデリゲートにして、didShowViewController
メソッドを実装できます。
class FooBarController: UIViewController, UINavigationControllerDelegate {
func viewDidLoad() {
self.navigationController?.delegate = self
}
func navigationController(navigationController: UINavigationController, didShowViewController viewController: UIViewController, animated: Bool) {
// your awesome completion code here
}
}
このアプローチは、タスクにとってより便利な場合があります
正しく理解できるかどうかはわかりませんが、次のようにViewControllerを完了ブロックにプッシュしました。テーブルビューコントローラで、ヘッダーファイルに次の行を追加しました。
_typedef void(^myCompletion)(BOOL);
_
次に、クラス自体に次のメソッドを追加しました。
_-(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];
});
}
}];
_
ビューコントローラーをメインスレッドの外にプッシュしてもよいかどうかわからないので、その呼び出しをdispatch_async()
に埋め込みました。
-[UIViewControllerTransitionCoordinator animateAlongsideTransitionInView:animation:completion:]
を使用してみてください:
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
if (!self.isPushing) {
self.pushing = YES;
[super pushViewController:viewController animated:animated];
if (!self.transitionCoordinator) {
self.pushing = NO;
} else {
[self.transitionCoordinator animateAlongsideTransition:nil completion:^(id<UIViewControllerTransitionCoordinatorContext> context) {
self.pushing = NO;
}];
}
}
}