2010-11-24 10 views
2

Ich versuche, die richtige Schaltfläche der Navigationsleiste aus der appDelegate, der Code kompiliert und führt ohne Fehler, aber die Schaltfläche nicht angezeigt wird.iphone setRightBarButtonItem von AppDelegate

Jede Hilfe wäre willkommen.

Danke.

NSAutoreleasePool *apool = [[NSAutoreleasePool alloc] init]; 
    UIActivityIndicatorView *aiv = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite]; 
    UIBarButtonItem *activityButtonItem = [[UIBarButtonItem alloc] initWithCustomView:aiv]; 
    [aiv startAnimating]; 
    [aiv release]; 


    [self.navigationController.navigationItem setRightBarButtonItem:activityButtonItem animated:YES]; 
    [activityButtonItem release]; 
    [apool release]; 

Antwort

2

Zuerst ein paar Hinweise.

Sie verwenden eine NSAutoReleasePool in Situationen, in denen Sie eine Menge von Autoreleased-Objekten in kurzer Zeit erstellen, z. in einer Schleife. Zitiert von Apple:

Wenn Ihre Anwendung eine Menge temporäre Autoreleased Objekte erstellt innerhalb die Ereignisschleife, kann es jedoch von Vorteil sein „local“ erstellen Autorelease-Pools helfen den Spitzenspeicherbedarf zu minimieren .

Da Sie nicht jede Autoreleased Objekte zu schaffen es nicht notwendig ist, die NSAutoReleasePool zu haben.

Normalerweise würden Sie den Code setzen die Schaltflächen der Navigationsleiste in viewDidLoad des UIViewController einzustellen, die auf die Taste reagieren soll. Wenn UINavigationController einen neuen UIViewController auf seinen Stack schiebt, wird der Controller nach den Tasten gefragt, die angezeigt werden sollen.

Nehmen wir an, der Root-View-Controller Ihrer UINavigationController ist der standardmäßig generierte RootViewController. Dann sollten Sie den Code in viewDidLoad von RootViewController setzen. Oder vielleicht in viewDidAppear:, da Sie das Einfügen animieren.

UIActivityIndicatorView *aiv = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite]; 
UIBarButtonItem *activityButtonItem = [[UIBarButtonItem alloc] initWithCustomView:aiv]; 
[aiv startAnimating]; 
[aiv release]; 

[self.navigationItem setRightBarButtonItem:activityButtonItem animated:YES]; 
[activityButtonItem release]; 

Wenn Sie wirklich müssen den Code in der App delegieren, die sie durch erreicht werden kann:

UIActivityIndicatorView *aiv = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite]; 
UIBarButtonItem *activityButtonItem = [[UIBarButtonItem alloc] initWithCustomView:aiv]; 
[aiv startAnimating]; 
[aiv release]; 

UIViewController *rootController = [self.navigationController topViewController]; 
rootController.navigationItem.rightBarButtonItem = activityButtonItem;  
[activityButtonItem release]; 
+0

dank i zu diesem Beitrag als separate Antwort geschrieben habe, wie meine Antwort auf lange war .. – Mike

+0

Ich glaube, Sie Ihre Frage bearbeiten sollen, und es mit den Singleton-Informationen aktualisieren. Es macht mehr Sinn, warum Sie die Schaltfläche aus dem App-Delegaten hinzufügen möchten. Es macht es auch einfacher, eine gute Antwort zu geben und die Antwort zu verstehen, wenn alle relevanten Informationen in der Frage enthalten sind. –

+0

Ich habe es mit der Info aktualisiert und verlinke auf das Singleton-Objekt MKStoreKit 3. Ich hoffe, das hilft und schätzt Ihre Eingabe. – Mike

0

Robert Danke für den Rat.

Ich habe die Autorelease herausgenommen und zu schätzen sollte normalerweise in der ViewDidLoad verwendet werden und kann einwandfrei funktionieren, wenn sie dort verwendet wird, um die Aktivitätsanimation zu starten.

Das Problem ich habe, ist:

i den Beispielcode in den entsprechenden View-Controller verwenden kann, um die Animation

UIActivityIndicatorView *aiv = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite]; 
UIBarButtonItem *activityButtonItem = [[UIBarButtonItem alloc] initWithCustomView:aiv]; 
[aiv startAnimating]; 
[aiv release]; 

[self.navigationItem setRightBarButtonItem:activityButtonItem animated:YES]; 
[activityButtonItem release]; 

aber ich einen Singleton für IAP-Objekt zu beginnen habe, die aus verschiedener Ansicht aufgerufen wird Controller innerhalb meiner App und ich muss in der Lage sein, die Animation zu stoppen - denke, muss nur die richtigeBarButton = Nil setzen, aber kämpfen um herauszufinden, wie das Singleton-Objekt den entsprechenden View-Controller die Animation stoppen kann.

Ich dachte, zu versuchen, wie etwas zu verwenden:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector (IAP_complete:) name: IAP_completeNotification object:nil]; 

habe aber nicht den kompletten Prozess Anfang bis Ende herausgefunden. Schätzen Sie jede Hilfe, die Sie anbieten können;

  1. Viewcontroller die rightBarItem Einstellung und Starten der Animation (fertig)
  2. NSNotificationCenter für IAP zu hören Einrichtung abgeschlossen (wenn dies der beste Weg zu erreichen), um das Singleton-Objekt NSNotificationCenter
  3. Einrichtung der auszustrahlen IAP ist komplett

auf dieser

erweitern ich die MKStoreKit 3 von Mugunth Kumar bin mit @http://blog.mugunthkumar.com/coding/introducing-mkstorekit-

In meinem VC verwende ich das nach dem Kauf in app

//display activity indicator 
UIActivityIndicatorView *aiv = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite]; 
UIBarButtonItem *activityButtonItem = [[UIBarButtonItem alloc] initWithCustomView:aiv]; 
[aiv startAnimating]; 
[aiv release]; 

[self.navigationItem setRightBarButtonItem:activityButtonItem animated:YES]; 
[activityButtonItem release]; 

//begin in app purchase 
[[MKStoreManager sharedManager] buyFeature:appID]; 

einzuleiten Sobald dies abgeschlossen ist, ich brauche die VC zu sagen, dass dieser Vorgang abgeschlossen ist. MKStoreManager.m

in der Datei

- (void) provideContent: (NSString *) Product forReceipt: (NSData *) receiptData

i entsperren oder Herunterladen von Inhalten hier aber müssen die Aktivitätsanzeige stoppen auch, wo ich die Handlung vermisse.

Danke, Mike

+0

ok das ist jetzt sortiert und funktioniert perfekt mit dem NSNotificationCenter .. – Mike