あなたのビューコントローラーにコードを書いたくないので、私はあなたのためにハッキリしています。使用する場合にのみ動作します:あなた
UINavigationController + PushNotifier.h
#import <UIKit/UIKit.h>
@interface UINavigationController (PushNotifier)
extern void PJSwizzleMethod(Class cls, SEL originalSelector, SEL swizzledSelector);
@end
UINavigationController + PushNotifier.m
#import "UINavigationController+PushNotifier.h"
#import <objc/runtime.h>
@implementation UINavigationController (PushNotifier)
+ (void)load {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
PJSwizzleMethod([self class],
@selector(pushViewController:animated:),
@selector(pj_pushViewController:animated:));
});
}
- (void)pj_pushViewController:(UIViewController *)viewController animated:(BOOL)animated {
//notify your Application Delegate
[[NSNotificationCenter defaultCenter] postNotificationName:@"ViewControllerWillPush" object:nil userInfo:@{@"pushingViewController":viewController}];
return [self pj_pushViewController:viewController animated:animated];
}
@end
void PJSwizzleMethod(Class cls, SEL originalSelector, SEL swizzledSelector)
{
Method originalMethod = class_getInstanceMethod(cls, originalSelector);
Method swizzledMethod = class_getInstanceMethod(cls, swizzledSelector);
BOOL didAddMethod =
class_addMethod(cls,
originalSelector,
method_getImplementation(swizzledMethod),
method_getTypeEncoding(swizzledMethod));
if (didAddMethod) {
class_replaceMethod(cls,
swizzledSelector,
method_getImplementation(originalMethod),
method_getTypeEncoding(originalMethod));
} else {
method_exchangeImplementations(originalMethod, swizzledMethod);
}
}
注意のために以下の私のカテゴリをチェックしてくださいナビゲーションコントローラおよびプッシュ/ショービューコントローラ
ViewControllerは、ナビゲーションコントローラが所有するそれぞれのナビゲーションスタックからプッシュおよびポップされます。 AppDelegateは、UIApplicationオブジェクトのライフイベントへの代理人にすぎません。彼らは全く関係していませんあなたは何を達成しようとしていますか? –
本当に余分な方法を呼び出すことなく? –