2016-07-13 10 views
0

特定のビューコントローラが表示されて消えるたびにviewWillAppearおよびviewWillDisappearメソッドが呼び出されることは知っています。ビューコントローラが表示または非表示になったときにAppDelegateでカスタムメソッドを呼び出す方法

ビューコントローラが表示されるか、または表示されなくなると、AppDelegateメソッドが呼び出されるようにします。

これは可能ですか?

+0

あなたが実際に達成しようとしていることについてのより具体的な詳細で質問を更新する必要があります。 – rmaddy

答えて

0

の代わりに(すべてのビューコントローラがそれを継承しなければならないことを義務付けるため、密結合が導入されてしまう)のUIViewControllerをオーバーライド代わりに、あなたはのUIViewControllerの拡張とスウィズルを作成することができますviewWillAppearおよびviewWillDisappear。

このリンクは

http://nshipster.com/method-swizzling/

それはviewWillAppear.Youがxxx_viewWillAppear方法でアプリのデリゲートメソッドを呼び出しますスウィズルするためのコードを提供しスウィフト

でのUIViewControllerをスウィズルするために必要なすべての詳細とコードを持っています。

+0

ありがとうございました.... – Sakthikumar

-1

まず、この機能を組み込むUIViewControllerをサブクラス化します。すべてのView Controllerはこの新しいクラスから継承します。次に、必要に応じてappDelegateにパブリックメソッドを記述します。次のように第三に、カスタムメソッドを作る:

override func viewDidAppear(animated: Bool) { 
    super.viewDidAppear(animated) 
    if let appDelegate = UIApplication.sharedApplication().delegate as? AppNameAppDelegate{ 
     appDelegate.doCustomMethod() 
    } 
} 
0

@Sausage Modulation Matrixによると、これはあなたを助けるビューコントローラカテゴリです。 new_viewWillAppear:またはnew_viewWillDisappear:は、一般にUIViewControllerライフサイクルメソッド呼び出し時に呼び出します。 このswizzleメソッドでは、必要に応じてappDelegateメソッドを実行できます。ここで

のUIViewController + ViewControllerSwizzle.m

#import "UIViewController+ViewControllerSwizzle.h" 
#import <objc/runtime.h> 
#import "AppDelegate.h" 

void standard_swizzle(Class cls, SEL original, SEL replacement) { 
    Method originalMethod; 
    if ((originalMethod = class_getClassMethod(cls, original))) 
    { 
     Method replacementMethod = class_getClassMethod(cls, replacement); 
     method_exchangeImplementations(originalMethod, replacementMethod); 
    } 
    else 
    { 
     IMP replacementImplementation = method_setImplementation(class_getInstanceMethod(cls, replacement), class_getMethodImplementation(cls, original)); 
     if (!class_addMethod(cls, original, replacementImplementation, method_getTypeEncoding(class_getInstanceMethod(cls, replacement)))) method_setImplementation(class_getInstanceMethod(cls, original), replacementImplementation); 
    } 
} 


@implementation UIViewController (ViewControllerSwizzle) 

+(void)load 
{ 
    if (self == [UIViewController class]) { 
     static dispatch_once_t onceToken; 
     dispatch_once(&onceToken, ^{ 
      NSArray *methods = @[@"viewWillAppear:", @"viewWillDisappear:"]; 

      for (NSString* methodName in methods) { 
       standard_swizzle(self, NSSelectorFromString(methodName), NSSelectorFromString([NSString stringWithFormat:@"new_%@", methodName])); 
      } 
     }); 
    } 

} 

-(void)new_viewWillAppear:(BOOL)animated 
{ 
    [self new_viewWillAppear:animated]; 

    [[AppDelegate sharedManager] viewWillAppearStuff]; //AppDelegate custom method. 
} 
-(void)new_viewWillDisappear:(BOOL)animated 
{ 
    [self new_viewWillDisappear:animated]; 

    [[AppDelegate sharedManager] viewWillDisppearStuff]; //AppDelegate custom method. 
} 

@end 

はシンプルAppDelegateのものである:

AppDelegate.hファイル:

#import <UIKit/UIKit.h> 

@interface AppDelegate : UIResponder <UIApplicationDelegate> 

@property (strong, nonatomic) UIWindow *window; 

+(AppDelegate *)sharedManager; 
-(void)viewWillAppearStuff; 
-(void)viewWillDisppearStuff; 
@end 

AppDelegate.mファイル:

#import "AppDelegate.h" 

@implementation AppDelegate 

+(AppDelegate *)sharedManager 
{ 
    static AppDelegate *sharedMyManager = nil; 
    @synchronized(self) 
    { 
     if (sharedMyManager == nil) 
     { 
      sharedMyManager = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 
     } 
    } 
    return sharedMyManager; 
} 
-(void)viewWillAppearStuff 
{ 
    /* 
    Do Something. 
    */ 
} 
-(void)viewWillDisppearStuff 
{ 
    /* 
    Do Something. 
    */ 
} 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    // Override point for customization after application launch. 
    return YES; 
} 

@end 

ハッピーコーディング。

関連する問題