Frage

Ich habe meine Navigationsleiste in meiner iPhone -App zu einer Aktualisierung von UibarbuttonItem hinzugefügt. Wenn der Benutzer auf die Schaltfläche tippt, möchte ich, dass die Taste von Aktualisierung in den Animationsaktivitätsanzeige wechselt, und sobald der Vorgang (in diesem Fall ein Download) die Aktivitätsanzeige wieder auf die Taste Aktualisierung wechselt.

Ich habe die Aktualisierungstaste mit IB hinzugefügt. Dann tippen Sie auf der Schaltfläche Tippen Ich erstelle einen neuen Aktivitätsanzeige und behalte einen Zeiger auf die ursprüngliche Aktualisierungsschaltfläche. Like SO:

refreshButtonItem = self.navigationItem.leftBarButtonItem;
if (activityButtonItem == nil)
{
    activityIndicator = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(0, 0, 20,20)];
    activityButtonItem = [[UIBarButtonItem alloc]initWithCustomView:activityIndicator];

}
self.navigationItem.leftBarButtonItem = activityButtonItem;
[activityIndicator startAnimating];

So weit, ist es gut. Das Problem ist, dass mein Download abgeschlossen ist und ich versuche, die Taste von Aktualisierung neu zu nutzen (mit folgenden):

[activityIndicator stopAnimating];
self.navigationItem.leftBarButtonItem = refreshButtonItem;

Ich bekomme den folgenden Fehler:
UibarbuttonItem retain]: Nachricht, die an die Deallocated Instance gesendet wurde

Ich rufe nicht explizit Release an.

A) Wenn/wo wird das behandelt?

B) Gibt es einen besseren Weg, um das zu erreichen, wonach ich suche?

War es hilfreich?

Lösung

Wenn Sie den AktivitätsbuttonItem dem LinkbuttonItem zuweisen, wird der Artikel, auf den Linksbartonitem verweist, veröffentlicht. Der LinkbuttonIton (und alle Eigenschaften mit der Option der Rückhalte) sind ähnlich wie folgt implementiert:

- (void)leftBarButtonItem:(UIBarButtonItem *)newItem {
  if (newItem != self.leftBarButtonItem) {
    [self.leftBarButtonItem release];
    leftBarButtonItem = [newItem retain];
  }
}

Wenn Sie nach der Neuzuweisung des Linksbartonitems das RefreshbuttonItem verwenden möchten, ändern Sie Ihre erste Zeile in:

refreshButtonItem = [self.navigationItem.leftBarButtonItem retain];

Andere Tipps

Da iOS 5 mit der Einführung des Bogens nicht mehr behalten müssen.

Die Lösung kann als @Cagreen erlangt werden, während das Aktualisierungsteiltonitem als Klasseneigenschaft sowie Lade -Tutton und LoadingView gespeichert werden kann.

In Ihrer Schnittstelle deklarieren Sie:

@property (strong, nonatomic) UIBarButtonItem *refreshButton;
@property (strong, nonatomic) UIBarButtonItem *loadingButton;
@property (strong, nonatomic) UIActivityIndicatorView *loadingView;

Init Ladebutton und LoadingView in Ihrer ViewDIDLoad -Methode:

self.loadingView = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(0, 0, 20, 20)];
self.loadingButton = [[UIBarButtonItem alloc] initWithCustomView:self.loadingView];

Dann können Sie einfach den Ladespinner zeigen:

 // Shows loading button
- (void)showLoadingView {

    // Keep reference to right bar button
    if (self.navigationItem.rightBarButtonItem) {
        self.refreshButton = self.navigationItem.rightBarButtonItem;
    }

    // Start animating and assign loading button to right bar button
    [self.loadingView startAnimating];
    self.navigationItem.rightBarButtonItem = self.loadingButton;
}

Und zu verbergen:

 // Hides loading button
- (void)hideLoadingView {
    [self.loadingView stopAnimating];
    self.navigationItem.rightBarButtonItem = self.refreshButton;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top