2016-07-04 4 views
0

Ich möchte eine Zeichenfolge innerhalb einer viewDidAppear übergeben, aber es dauert nur BOOL-Wert. Aber ich muss das viewDidAppear für verschiedene viewcontrollers verwenden und in jedem View-Controller möchte ich andere Zeichenfolge verwenden.Übergeben einer Zeichenfolge in viewDidAppear in objective-c

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    id<GAITracker> tracker = [[GAI sharedInstance] defaultTracker]; 
    [tracker set:kGAIScreenName value:@"Google Analytics"]; 
    [tracker send:[[GAIDictionaryBuilder createScreenView] build]]; 
} 

Hier im Wert wollen wir eine Reihe von verschiedenen viewControllers passieren. Bitte helfen Sie!

+0

welche Saite Sie –

+1

ersetzen möchten Sie können die Parameter für einen Kakao-API ändern. Auf die Zeichenfolgenvariable muss von ViewDidAppear zugegriffen werden können, sie kann jedoch nicht an sie übergeben werden. – FredericP

+0

Wert: @ "Google Analytics" Dies sollte je nach Viewcontroller unterschiedlich sein. –

Antwort

1

Möchten Sie den Namen des ViewControllers in Google Analytics senden?

Wenn es richtig ist, ändern Sie die value die traker Be

[tracker set:kGAIScreenName value:@"change here"]

1

Diese leicht durch die Verwendung von Unterklasse erreicht werden kann.

  1. Erstellen einer Unterklasse von Typ UIViewController wie

SuperViewController.h

@interface SuperController : UIViewController 
@property (strong,nonatomic)NSString *screenValue; 
@end 

SuperViewController.m

@implementation SuperViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view. 
} 

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 

    id<GAITracker> tracker = [[GAI sharedInstance] defaultTracker]; 
    [tracker set:kGAIScreenName value:screenValue]; 
    [tracker send:[[GAIDictionaryBuilder createScreenView] build]]; 
} 

@end 
  1. Jetzt SuperViewController als Unterklasse aller Viewcontrollers verwenden Sie den Code in viewDidAppear wie

YOURViewController.h

@interface YOURViewController : SuperViewController 

@end 

YOURViewController.m

verwenden möchten
@implementation YOURViewController 
- (void)viewDidLoad { 
    [super viewDidLoad]; 
    [email protected]"YOURSCREENVALUE"; 
} 
@end 

Definieren Sie die screenValue Wert in viewDidLoad von jedem ViewController, dem Sie SuperViewController als Unterklasse zugewiesen haben, wird viewDidAppear automatisch mit einem bestimmten screenName aufgerufen.

Ich hoffe, es hilft.

+0

Es gibt ein Problem damit, wegen der einzelnen Vererbung auf Obj-C, können Sie diese Methode nicht verwenden, wenn Sie von 'UITableViewController',' UICollectionViewController' etc. erben. – Losiowaty

+0

Es gibt eine andere Lösung, 'UITableViewController' oder' UICollectionViewController nicht zu verwenden 'benutze nur' UIViewController' und bette 'UITableView' oder' UICollectionView' hinein? – iphonic

+0

Sie haben Recht, obwohl Sie einige Dinge verlieren - automatisches Scrollen zu fokussierten Textfeldern, statischen Zellen im Storyboard usw. Außerdem wird das Problem noch schlimmer, wenn Sie eine benutzerdefinierte Bibliothek (z. B. aus einem Cocoapod) verwenden möchten von ihrem benutzerdefinierten Ansichtscontroller zu erben. – Losiowaty

1

Eine Alternative zur Unterklasse wäre die Verwendung von Objective-C-Kategorien. Eine Kategorie ermöglicht das Hinzufügen einer Methode zu einer Klasse (einschließlich Klassen aus SDK).

Sie könnte also so etwas wie dieses:

in UIViewController+Tracking.h

@interface UIViewController (Tracking) 

- (void)track:(NSString *)trackingValue; 

@end 

und in UIViewController+Tracking.m

@implementation UIViewController (Tracking) 

- (void)track:(NSString *)value { 
    id<GAITracker> tracker = [[GAI sharedInstance] defaultTracker]; 
    [tracker set:kGAIScreenName value:trackingValue]; 
    [tracker send:[[GAIDictionaryBuilder createScreenView] build]]; 
} 

@end 

Danach werden alle Instanzen und Subklassen von UIViewController (einschließlich, zum Beispiel, UITableViewController und seine Unterklassen) wird diese Methode verfügbar haben.Und dann können Sie es wie folgt verwendet werden:

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    [self track:@"value you want to track"]; 
} 
+0

Was ist, wenn ich dies für drei oder vier Klassen möchte, sollte ich eine separate Kategorien für sie erstellen? –

+0

Wenn alle von "UIViewController" erben, dann wird keine. Sie können mehr über Kategorien [hier] lesen (https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/CustomizingExistingClasses/CustomizingExistingClasses.html). Wenn sie auf der anderen Seite keine gemeinsame Elternklasse haben, würde ich vorschlagen, eine Singleton-Klasse zu erstellen, um Ihr Tracking zu verwalten. – Losiowaty

Verwandte Themen