iPhone - Programmgestützte Navigationsleiste -Taste in Aktivitätsanzeige ändern
-
20-09-2019 - |
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?
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;
}