web-dev-qa-db-ja.com

完了ブロックでViewControllerをプッシュすることは可能ですか?

UINavigationControllerのドキュメントには、pushViewControllerメソッドとcompletion:パラメータ。

18
user3300062

より良い解決策は、プッシュアニメーションをCATransactionでラップし、completionBlockを設定することです。タイミングを扱う必要はありません。

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

justMartinの答えは私にとって素晴らしいものでした。 Swift APIを初めて使用する場合:

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

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 
  }
}

このアプローチは、タスクにとってより便利な場合があります

10
danshevluk

正しく理解できるかどうかはわかりませんが、次のようにViewControllerを完了ブロックにプッシュしました。テーブルビューコントローラで、ヘッダーファイルに次の行を追加しました。

_typedef void(^myCompletion)(BOOL);
_

次に、クラス自体に次のメソッドを追加しました。

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

didSelectRowAtIndexPathmyMethodを呼び出し、完了ブロックでビューコントローラーをプッシュしました。

_[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()に埋め込みました。

2
Bart van Kuik

-[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;
            }];
        }
    }
}
1
Lizhen Hu