12

「修理」しようとしているアウトソーシングから巨大なプロジェクト受け取りました。プロジェクト内には何百ものView Controllerがあります。私たちの目標は、デバイスで現在見ているクラスを簡単に判断することです。

私たちの解決策(うまくいかなかったので、SOの質問)は次のとおりです。

これを使用して、カテゴリを介して UIViewController の viewDidAppear メソッドをオーバーライドします。

-(void)viewDidAppear:(BOOL)animated
{
    NSLog(@"Current View Class: %@", NSStringFromClass(self.class));
    [self viewDidAppear:animated];
    //Also tried this:
    //[super viewDidAppear:animated];
}

このカテゴリは、プロジェクトの.pchに配置されます。

これにより、何百ものView Controllerに追加のコードを配置する必要がなくなり、簡単にオンとオフを切り替えることができます. これが機能しなかったのは、< meme >カテゴリを介して既存のメソッドを単純にオーバーライドできないためです。< /meme >.

何が足りないの?!?

4

7 に答える 7

14

答えは、メソッドを入れ替えることです! これが私たちが思いついたものです:

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

@implementation UIViewController (Logging)

-(void)swizzled_viewDidAppear:(BOOL)animated
{
    NSLog(@"Current View Class: %@", NSStringFromClass(self.class));
    [self swizzled_viewDidAppear:animated];
}

+ (void)load
{
    Method original, swizzled;

    original = class_getInstanceMethod(self, @selector(viewDidAppear:));
    swizzled = class_getInstanceMethod(self, @selector(swizzled_viewDidAppear:));

    method_exchangeImplementations(original, swizzled);

}
@end
于 2012-12-13T17:52:27.810 に答える
3

これがこれに対する解決策です

.pch ファイルにこれを含めます

#define UIViewController MyViewController
#import "MyViewController.h"

新しい UIViewController サブクラスを次のように作成します

.h ファイル

#import <UIKit/UIKit.h>

#ifdef UIViewController
#undef UIViewController
#endif
@interface MyViewController : UIViewController

@end
#ifndef UIViewController
#define UIViewController MyViewController
#endif

そして.mファイル

#import "MyViewController.h"

@implementation MyViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSLog(@"Current View Class: %@", NSStringFromClass(self.class));
}

@end
于 2012-12-13T18:08:38.747 に答える
1

ビュー コントローラーは共通の基本クラスを共有していますか? もしそうなら、[viewDidAppear:] の基本クラスの実装にそれを置くことができます。それらが共通の基盤を共有していない場合、それは将来的に役立つ可能性があるため、おそらく価値のあるタスクになるでしょう (共通の分析コードなど)。

于 2012-12-13T17:28:04.350 に答える
0

アプリはナビゲーション コントローラーを使用してビュー コントローラーを表示しますか? その場合、NavigationController のメソッドを使用して現在のコントローラーを報告できます。

    - (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated
    {
        [self reportNewController:viewController];
    }

    - (void) reportNewController:(UIViewController *)viewController
    {
        NSString *name = viewController.title;
            NSLog(@"Name is %@",name);
    }
于 2012-12-13T18:13:12.840 に答える
0

Xcode からアプリケーション全体の検索と置換を行うことができますが、必ずしもすべてのケースが見つかるとは限りません (ただし、試したアプローチもそうではありません)。「[super viewDidLoad];」を探すことができます。「[super viewDidLoad]; NSLog(@"Current View Class: %@", NSStringFromClass(self.class));」に置き換えます。

于 2012-12-13T17:53:37.760 に答える