2011-01-15 13 views
0

Ich hatte die UIActivityIndicatorView funktioniert im Simulator und andere 3.0-Geräte in meiner App. Aber ich habe herausgefunden, dass es sich im neuen iphone 4 nicht dreht (oder zeigt). Grundsätzlich muss ich den Aktivitätsindikator anzeigen, wenn eine Schaltfläche angeklickt wird, und ausblenden, wenn das Klickereignis abgeschlossen ist. Ich benutzte den folgenden Ansatz.Noch eine Frage zum Anzeigen von UIActivityIndicator

[NSThread detachNewThreadSelector: @selector(spinBegin) toTarget:self withObject:nil];

von diesem link. Wie bereits erwähnt, dreht es den Aktivitätsindikator für alle mit Ausnahme von 4 korrekt. * .. nicht sicher warum. Um dies zu umgehen, folgte ich auch einen anderen Ansatz so etwas wie (von developer.apple.com)

` (IBAction) syncOnThreadAction: (id) sender

{

[self willStartJob]; 



[self performSelectorInBackground: 

    @selector(inThreadStartDoJob:) 

    withObject:theJobToDo 

]; 

}

(void) inThreadStartDoJob: (id) theJobToDo

{

NSAutoreleasePool * pool; 

NSString *   status; 



pool = [[NSAutoreleasePool alloc] init]; 

assert(pool != nil); 



status = [... do long running job specified by theJobToDo ...] 

[self performSelectorOnMainThread: 

    @selector(didStopJobWithStatus:) 

    withObject:status 

    waitUntilDone:NO 

]; 



[pool drain]; 

}

`

Das Problem dabei war, dass es den acitivityVIewIndicator zeigt richtig (zumindest auf dem Simulator) dreht sie, aber nach dem Anschlag, die in Aktivitätsanzeige in der oberen Leiste gebaut (wo es die Batterie% etc zeigt) dreht sich immer noch.

Ich bin neu bei Ziel C. Ich habe meine App komplett abgeschlossen, aber für diese dumme Sache. Mir ist klar, dass es keine Möglichkeit gibt, UIActivityView anzuzeigen, ohne einen anderen Thread zu starten. und schließlich, nur um zu schimpfen, verstehe ich nicht, warum sie es so kompliziert machen müssen. Ich meine, sie wussten, dass es dieses Problem haben würde. Warum nicht einen Beispielcode bereitstellen, den jeder verwenden kann, statt eigene Lösungen zu finden?

Schließlich kann mir bitte jemand eine Richtung oder einen Beispielcode zur Verfügung stellen. Ich würde das wirklich zu schätzen wissen. Ich habe jetzt ein paar Stunden gesucht und nichts gefunden was wirklich funktioniert!

Antwort

4

Warum starten/stoppen Sie den Indikator auf einem separaten Thread? Beliebige Methoden, die Sie an Ihre UIActivityIndicatorView senden, müssen auf dem Hauptthread (UI) gesendet werden.

Alle Ereignisse, die durch Drücken einer Taste gesendet werden, werden automatisch im Hauptthread ausgeführt. Wenn Sie Hintergrund-Threads verwenden um den Vorgang abzuschließen, könnte man so etwas tun:

- (IBAction)buttonPressed:(id)sender { 
    // This runs on the main thread 
    [activityIndicator startAnimating]; 
    [self performSelectorInBackground:@selector(inThreadStartDoJob:) withObject:theJobToDo]; 
} 

- (void)inThreadStartDoJob:(id)theJobToDo { 
    // Set up autorelease pool 
    ... 
    // Run your long-running action 
    ... 
    // Stop the spinner. Since we're in a background thread, 
    // we need to push this to the UI Thread 
    [activityIndicator performSelectorOnMainThread:@selector(stopAnimating) withObject:nil waitUntilDone:YES]; 
} 

Edit: Wie für die Aktivitätsanzeige in der oberen Leiste (wo die Batterie ist), nicht diese automatisch Start/Stopp basierend auf Netzwerkaktivität?

+0

Die letzte Codezeile, die Sie erwähnt haben, [activityIndicator performSelectorOnMainThread: @selector (stopAnimating) withObject: nil waitUntilDone: YES]; meinst du [SELF performSelectorOnMainThread: @selector (stopAnimating) withObject: keine waitUntilDone: YES]; Wenn ja, das ist genau das, was ich tue und es scheint zu funktionieren, bis auf den Aktivitätsindikator in der oberen Leiste.Ich wusste nicht, dass es auf Netzwerkaktivität basiert, lassen Sie mich einen Blick darauf werfen. –

+0

Ich werde diese Antwort akzeptieren. Am Ende habe ich [UIApplication sharedApplication] .networkActivityIndicatorVisible = NO; , um den Netzwerkindikator nicht anzuzeigen. Ich habe Netzwerkaktivität, aber das ist alles abgeschlossen, wenn ich die Stop-Methode anrufe. Nicht wirklich sicher, was dort vor sich geht. –