• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Einige Blicke in fremde Welten dürft Ihr nun bestaunen und darüber abstimmen, welche davon Euch am meisten gefällt: hier geht es lang für Euer Voting --> Klick

viewDidLoad warum nicht immer?

TroRon

Empire
Registriert
09.09.10
Beiträge
88
Hallo miteinander

Ich hätte auch mal wieder eine kleine Frage, bei welcher ich gem. meinen Recherchen unterschiedliche Antworten dazu fand.

Also:
iPersonalAppDelegate .h und .m
iPersonalViewController .h und .m

Beim ersten Start der Applikation wird die Funktion viewDidLoad korrekt durchgeführt. Alle meine Einstellungen werden gelesen, alles wunderbar.

Beim zweiten Start, aus dem Hintergrund wird diese Funktion einfach nicht durchgeführt. Ich frage mich ernsthaft wieso?

Liegt es daran, dass die View (da im Hintergund) noch geladen ist? Wenn ja, wie kann ich meiner App beibringen, dass die Funktion viewDidLoad bei jedem Start, unabhängig ob aus dem Hintergrund, oder ganz frisch, ausgeführt wird.

Eine mögliche Lösung welche ich gefunden habe wäre, bei applicationDidEnterBackground (iPersonalAppDelegate.m) via exit(1) die App vollständig zu beenden. Aber dann muss der Anwender beim Start zu lange warten, deshalb kommt diese Lösung nicht in Frage, ausserdem ist es meiner Meinung nach nicht sauber.

Ich danke für alle Beiträge, ich verstehe das im Moment so nicht ....

Ich wünsche Euch allen angenehme Nachtruhe.
 
Du könntest einfach viewDidLoad innerhalb von applicationDidBecomeActive aufrufen.


Besser wäre jedoch, den Teil, der wiederholt ausgeführt werden soll, in eine separate Funktion packen und diese in applicationDidBecomeActive aufrufen.
 
Hallo Scheich

Besten Dank für Deine Antwort, das klingt logisch. Dann bin ich aber, wenn ich das recht sehe, wieder bei meinem DELEGATE Problem (siehe ebenfalls Forum).

Warte mittlerweile seit einer Woche auf ein Buch in welchem ich hoffe, eine gescheite Erklärung zu DELEGATE zu bekommen. Aus all den Dokus im Internet werde ich persönlich, bis jetzt, noch nicht so ganz schlau.
 
und ich würde dir nicht dazu raten jemals einen exit Aufruf zu machen.

Eine der wirklich wenigen Ausnahmen, wo das Sinn macht ist folgendes:
Code:
#import <Foundation/Foundation.h>
#include <signal.h>

void handle_segfault(int param){
    NSLog(@"get segmentation fault");
    // irgendwas sinnvolles machen, zb backtrace an eine E-Mail Adresse senden oder sowas.
    exit(1);
}

int main(...){ // wie war die Signatur in ObjC ? xD
    signal(SIGSEGV, handle_segfault);
}

ein exit Aufruf kann zu unerwarteten Auswirkungen führen, weswegen ein exitcall nur dann angebracht ist, wo sowieso entweder alles unerwartet ist oder man ein Programmabbruch erzwingen möchte.

Zum Thema viewDidLoad selbst aufrufen:
Das geht natürlich nur, wenn du einen Verweis auf die View hast, für die du die Methode erneut aufrufen willst. also: [delegate viewDidLoad:theView];

EDIT: das war natürlich Quatsch, richtig ist es so: [[theView delegate] viewDidLoad:theView];
 
@karolherbst

Besten Dank für Deine ausführliche Antwort :-)

Das dies mit dem EXIT Quatsch ist, ist mir durchaus bewusst :-) Drum habe ich ja geschrieben es sei nicht sauber.

Ich habe nun 1 Woche Ferien und hoffe, dass mein Buch endlich mal ankommt. Bin nun echt an einem Punkt angelangt, wo diese DELEGATE mir immer wieder nette Geschenke erzeugen :-)

Aber das wird schon werden, braucht halt alles seine Zeit....

Danke an alle :-)
 
EDIT: das war natürlich Quatsch, richtig ist es so: [[theView delegate] viewDidLoad:theView];
Nein, das ist auch nicht richtig. viewDidLoad ist keine Delegate-Methode und hat auch keinen Parameter, Views haben standardmäßig kein Delegate (siehe Doku zu UIView).

MacApple
 
ach mist, stimmt. Ich muss mich mal wieder mehr an ObjC setzen, bin grade zu sehr in C++ drinnen.
 
Hihi, na besten Dank auch, nun bin ich noch verwirrter :-))))))))))))
 
Also:

Wenn ich bei applicationDidBecomeActive meine View mit:


//Lade definierte View ...
self.window.rootViewController = [[iPersonalViewController alloc] initWithNibName:@"iPersonalViewController" bundle:[NSBundle mainBundle]];
[self.window makeKeyAndVisible];
[super self];

neu lade, wird logischerweise auch wieder das viewDidLoad ausgeführt.

An sich funktioniert so alles. Darf man das, sollte man das? Tut ja an sich niemanden weh, oder übersehe ich da was??

Das einzige was nun noch unschön ist, ist die Tatsache, dass Einstellungsänderungen erst beim zweiten Laden der Applikation übernommen werden. Finde ich irgendwie doof, weiss nur noch nicht, warum .....
 
@MacApple

Besten Dank für die Antwort.

Das heisst dann, ich steh wieder am Anfang ......
 
Also, wenn Du das, was Du in viewDidLoad machst bei jedem wieder Aktivieren der App machen willst, dann ist viewDidLoad nicht der richtige Ort das zu tun. Änderungen an den Einstellungen bekommst Du am einfachsten mit, wenn Du sie erst dort aus den NSUserDefaults liest, wo sie gebraucht werden. Warum willst Du Dir die Einstellungen noch einmal irgendwo zwischen speichern?

MacApple
 
Also das mit den Einstellungen konnte ich mittlerweile lösen, da hat ein [[NSUserDefaults standardUserDefaults] synchronize]; gefehlt.

Eigentlich geht es mir nur darum. dass wenn der Anwender die App mit dem Homebutton verlässt, in den Einstellungen Änderungen durchführt, die App wieder startet, diese auch übernommen werden.

Vor oben genannter Anpassung habe ich das Problem gehabt, dass nur beim ersten Start der Anwendung die Settings ausgelesen wurden. Im Prinzip möchte ich nur erreichen, dass die App, wenn aus Background, die Settings neu einliest. Den ganzen Rest im ViewDidLoad brauche ich eigentlich dort nicht.

Aber genau diesen Punkt bringe ich einfach nicht auf die Reihe, keine Ahnung warum ....
 
Und was hindert Dich daran, die Settings in applicationDidBecomeActive: einzulesen?

MacApple
 
Einzig und alleine die Tatsache, dass ich die Settings ja in der AppDelegate einlese, diese aber eigentlich in der iPersonalViewController brauchen würde. Wenn ich die dort einlese, habe ich in zweiten View keinen Zugriff darauf.

Aus diesem Grund habe ich das ja bei ViewDid... drin.

Wie gesagt, ich stehe mal wieder bei meinem fehlenden Delegate wissen an wie mir scheint, das doofe Buch ist noch immer nicht da *NERV* ;)

Ich hoffe ich konnte Dir mein Dilemma, was aus Deiner Erfahrungs-Sicht sicher keines ist, näherbringen :-))))