2017-10-13 11 views
0

AppDelegateで、AppDelegateとUIViewControllerで余分なメソッドを呼び出さずに新しいUIViewControllerがプッシュされることを知っていますか?UIViewControllerが別のUIViewControllerに遷移するとき、AppDelegateでどのように知ることができますか?

AppDelegateは、UIViewControllerの中でコードを書くことなく、新しいUIViewControllerがプッシュされていることを知ることができますか?

+3

ViewControllerは、ナビゲーションコントローラが所有するそれぞれのナビゲーションスタックからプッシュおよびポップされます。 AppDelegateは、UIApplicationオブジェクトのライフイベントへの代理人にすぎません。彼らは全く関係していませんあなたは何を達成しようとしていますか? –

+1

本当に余分な方法を呼び出すことなく? –

答えて

-2

ありそれを行うには適切な方法はありませんが、回避策としてこの方法を使用することができます:

func application (_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask { 
    guard let vc = (window?.rootViewController?.presentedViewController) else { 
     return .portrait // your default orientation, to update according to your needs 
    } 
    if (vc.isKind(of: NSClassFromString("The class you are looking to")!)) { 
// Here you can put any code you want, your view controller was just pushed 
     return .allButUpsideDown 
    } 
    return .portrait 
// return the orientation you want 
} 

問題は、アプリ内の各ViewControllerをのためにキャストを実行する必要がありますということですいくつかのカスタムコードをやっていると、より洗練されたものになり、ニーズに合ったものになります。

+0

質問で質問されているように、あなたのソリューションはどのView Controllerがアプリにプッシュされているかを検出しますか? –

+0

@AuRis成功した場合、ビューコントローラがプッシュされたことを意味します。/ –

+0

まず、ブレースが1つもないため、コードはコンパイルされません。第二に、それぞれの可能なクラスをチェックする必要がある場合、私はそれを回避策とも呼んでいません。そして、最も重要なのは、キャストが成功しても、View Controllerがプッシュされたわけではありません。 –

0

あなたのビューコントローラーにコードを書いたくないので、私はあなたのためにハッキリしています。使用する場合にのみ動作します:あなた

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

注意のために以下の私のカテゴリをチェックしてくださいナビゲーションコントローラおよびプッシュ/ショービューコントローラ

関連する問題