特定のビューコントローラが表示されて消えるたびにviewWillAppear
およびviewWillDisappear
メソッドが呼び出されることは知っています。ビューコントローラが表示または非表示になったときにAppDelegateでカスタムメソッドを呼び出す方法
ビューコントローラが表示されるか、または表示されなくなると、AppDelegate
メソッドが呼び出されるようにします。
これは可能ですか?
特定のビューコントローラが表示されて消えるたびにviewWillAppear
およびviewWillDisappear
メソッドが呼び出されることは知っています。ビューコントローラが表示または非表示になったときにAppDelegateでカスタムメソッドを呼び出す方法
ビューコントローラが表示されるか、または表示されなくなると、AppDelegate
メソッドが呼び出されるようにします。
これは可能ですか?
の代わりに(すべてのビューコントローラがそれを継承しなければならないことを義務付けるため、密結合が導入されてしまう)のUIViewControllerをオーバーライド代わりに、あなたはのUIViewControllerの拡張とスウィズルを作成することができますviewWillAppearおよびviewWillDisappear。
このリンクは
http://nshipster.com/method-swizzling/
それはviewWillAppear.Youがxxx_viewWillAppear方法でアプリのデリゲートメソッドを呼び出しますスウィズルするためのコードを提供しスウィフト
でのUIViewControllerをスウィズルするために必要なすべての詳細とコードを持っています。ありがとうございました.... – Sakthikumar
まず、この機能を組み込むUIViewControllerをサブクラス化します。すべてのView Controllerはこの新しいクラスから継承します。次に、必要に応じてappDelegateにパブリックメソッドを記述します。次のように第三に、カスタムメソッドを作る:
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
if let appDelegate = UIApplication.sharedApplication().delegate as? AppNameAppDelegate{
appDelegate.doCustomMethod()
}
}
@Sausage Modulation Matrixによると、これはあなたを助けるビューコントローラカテゴリです。 new_viewWillAppear:
またはnew_viewWillDisappear:
は、一般にUIViewController
ライフサイクルメソッド呼び出し時に呼び出します。 このswizzleメソッドでは、必要に応じてappDelegateメソッドを実行できます。ここで
#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のものである:
#import <UIKit/UIKit.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
+(AppDelegate *)sharedManager;
-(void)viewWillAppearStuff;
-(void)viewWillDisppearStuff;
@end
#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
ハッピーコーディング。
あなたが実際に達成しようとしていることについてのより具体的な詳細で質問を更新する必要があります。 – rmaddy