UINavigationController の完了ハンドラー「pushViewController:animated」? 質問する

UINavigationController の完了ハンドラー「pushViewController:animated」? 質問する

UINavigationController私は、次のビュー コントローラーを表示するためにを使用するアプリを作成しようとしています。iOS5 では、 を表示するための新しい方法がありますUIViewControllers

presentViewController:animated:completion:

さて、なぜ の完了ハンドラがないのかと自問しますUINavigationController

pushViewController:animated:

新しい のような独自の完了ハンドラーを作成することは可能ですかpresentViewController:animated:completion:?

ベストアンサー1

見るパーの答えより最新のソリューションについては

UINavigationControllerアニメーションは で実行されるため、コードを 内にカプセル化して完了ブロックを設定するのがCoreAnimation合理的です。CATransaction

迅速:

Swiftの場合は、次のような拡張機能を作成することをお勧めします

extension UINavigationController {

  public func pushViewController(viewController: UIViewController,
                                 animated: Bool,
                                 completion: @escaping (() -> Void)?) {
    CATransaction.begin()
    CATransaction.setCompletionBlock(completion)
    pushViewController(viewController, animated: animated)
    CATransaction.commit()
  }

}

使用法:

navigationController?.pushViewController(vc, animated: true) {
  // Animation done
}

オブジェクティブC

ヘッダ:

#import <UIKit/UIKit.h>

@interface UINavigationController (CompletionHandler)

- (void)completionhandler_pushViewController:(UIViewController *)viewController
                                    animated:(BOOL)animated
                                  completion:(void (^)(void))completion;

@end

実装:

#import "UINavigationController+CompletionHandler.h"
#import <QuartzCore/QuartzCore.h>

@implementation UINavigationController (CompletionHandler)

- (void)completionhandler_pushViewController:(UIViewController *)viewController 
                                    animated:(BOOL)animated 
                                  completion:(void (^)(void))completion 
{
    [CATransaction begin];
    [CATransaction setCompletionBlock:completion];
    [self pushViewController:viewController animated:animated];
    [CATransaction commit];
}

@end

おすすめ記事