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