12 Stimmen

Protokollierung der Klassennamen aller UIViewController in einem Projekt

Wir haben eine RIESIG Projekt aus dem Outsourcing, das wir zu "reparieren" versuchen. Es gibt Hunderte von View Controllern innerhalb des Projekts. Unser Ziel ist es, leicht zu bestimmen, welche Klasse wir gerade auf dem Gerät sehen.

Unsere Lösung (die nicht funktioniert hat, daher die SO-Frage) lautet wie folgt.

Überschreiben Sie die viewDidAppear-Methode von UIViewController über eine Kategorie mit dieser:

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

Diese Kategorie würde in die Kategorie .pch des Projekts.

Dies würde keinen zusätzlichen Code in den Hunderten von View Controllern erfordern und könnte leicht ein- und ausgeschaltet werden. Es hat nicht funktioniert, weil, wie wir jetzt gelernt haben, < Meme >Man kann eine bestehende Methode nicht einfach per Kategorie außer Kraft setzen< /meme >.

Was übersehen wir?!?

14voto

adamweeks Punkte 1342

Die Antwort ist, die Methoden durcheinander zu bringen! Das haben wir uns ausgedacht:

#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

8voto

Al___ Punkte 715

viewWillAppear Protokoll

Hier ist eine Lösung für drucken den Namen der aktuellen View-Controller-Klasse, wenn sie in der Konsole erscheint:

  • Erstellen einer Symbolischer Haltepunkt in Xcode
  • für Symbol , hinzufügen -[UIViewController viewWillAppear:]
  • für Aktion fügen Sie einen Debugger-Befehl und diesen Ausdruck hinzu: expr -- (void) printf(" %s\n", (char *)object_getClassName($arg1))
  • siehe Automatisches Fortfahren nach der Auswertung von Aktionen .

enter image description here

Das hat mir sehr geholfen, wenn ich mich im Projekt verlaufen habe!

deinit Protokoll

Sie können auch ein Protokoll hinzufügen, um zu sehen, wann Ihre View-Controller deinit genannt wird:

  • Eine weitere erstellen Symbolischer Haltepunkt
  • für Symbol , hinzufügen -[UIViewController dealloc]
  • für Aktion fügen Sie einen Debugger-Befehl und diesen Ausdruck hinzu: expr -- (void) printf(" %s\n", (char *)object_getClassName($arg1))
  • siehe Automatisches Fortfahren nach der Auswertung von Aktionen .

enter image description here

Dies ist sehr praktisch, um sicherzustellen, dass der View-Controller aus dem Speicher freigegeben wird und auch ein guter Indikator für das Abfangen der Zyklen beibehalten .

Ich schlage nicht vor, Swizzling zu verwenden, da dies die Gefahr birgt, dass Ihr Code weniger wartbar ist.

3voto

Inder Kumar Rathore Punkte 38280

Hier ist die Lösung für dieses Problem

Fügen Sie in Ihre .pch-Datei Folgendes ein

#define UIViewController MyViewController
#import "MyViewController.h"

Erstellen Sie Ihre neue UIViewController-Unterklasse als

.h-Datei

#import <UIKit/UIKit.h>

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

@end
#ifndef UIViewController
#define UIViewController MyViewController
#endif

Und .m-Datei

#import "MyViewController.h"

@implementation MyViewController

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

@end

1voto

Joel Martinez Punkte 45129

Haben die Viewcontroller eine gemeinsame Basisklasse? Wenn ja, könnten Sie es einfach in die Implementierung von [viewDidAppear:] der Basisklasse aufnehmen. Wenn sie nicht eine gemeinsame Basis teilen, dann vielleicht, dass eine lohnende Aufgabe wäre, wie es sowieso nützlich sein könnte in Zukunft (gemeinsame Analytik-Code, etc.)

0voto

rdelmar Punkte 103832

Sie können eine Anwendung weit suchen und ersetzen von Xcode, aber es wird nicht unbedingt jeden Fall finden (aber auch nicht die Ansätze, die Sie versucht haben). Sie könnten nach "[super viewDidLoad];" suchen und durch "[super viewDidLoad]; NSLog(@"Current View Class: %@", NSStringFromClass(self.class));" ersetzen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X