• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> Klick

Startzahl der App in NSUserDefaults speichern

nelfisch

Carola
Registriert
15.03.08
Beiträge
108
Hallo Leutz,
ich muss euch leider wieder nerven, Google spuckt mir dummerweise keine passende Antwort aus.
Also, wie folgt: Ich habe eine App geschrieben, und will bei jedem 10ten oder so start ein UIAlertView anzeigen. Soweit so gut, access ins NSUserDefaults gecodet und alles, bin da eigentlich auch auf dem laufendem, aber irgendwie will das nicht so ganz.
Code:
- (void)applicationDidFinishLaunching:(UIApplication *)application {    
	GeneralViewController* grav = [[GeneralViewController alloc] initWithTitle:@"" nibTitle:@"LoadScreen" height:nil];
	[window addSubview:grav.view];
	[self performSelector:@selector(showTable) withObject:self afterDelay:5];
    
	NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
	startNumber = [prefs integerForKey:@"startNumberSaved"];
	NSLog(@"%f", startNumber);
	
	//[window addSubview:tabController.view];
    [window makeKeyAndVisible];
}
das Log ist da, weil ich überprüfen wollte, ob er auch speichert...:D

Code:
- (void)applicationWillTerminate:(UIApplication *)application{
	startNumber++;
	[[NSUserDefaults standardUserDefaults] setInteger:startNumber forKey:@"startNumberSaved"];
	[[NSUserDefaults standardUserDefaults] registerDefaults:NULL];
}

bleibt nur noch zu sagen, dass mein AppDelegate, in welchem die beiden Methoden stehen, eine Entity
Code:
NSInteger* startNumber;
hat...
achso, und Xcode gibt mir genau zwei Fehlermeldungen, einmal in der Start-Methode, da sagt er an der Stelle , wo ich in startNumber den Integer aus den NSUserDefaults LADE : „Warning: Initialization makes pointer from integer without a cast"
und an der Stelle, wo ich die Variable startNumber unter dem Key:mad:"startNumberSaved" im Defaults speichern will, da kommt: „Warning:passing argument 1 of „setInteger:forKey" makes integer from pointer without a cast"...
Dumm,oder?^
Hoffe ihr könnt mir helfen,
nelfisch :)
 

sumpfmonsterjunior

Morgenduft
Registriert
17.03.05
Beiträge
167
NSInteger ist keine Klasse wie etwa NSNumber, sondern ein typedef auf einen Ganzzahltypen der jeweiligen Laufzeitumgebung (32/64Bit), findeste in der Doku.
Du brauchst also keinen Zeiger sondern direkt den Wert (ohne den *operator), siehe die Fehlermeldung des Compilers.
Mach es folgendermaßen:
Code:
...Appdelegate
@interface AppDelegate...
{
   ...
   NSInteger startNumber;
}
@property (assign) NSInteger startNumber;
...
 

nelfisch

Carola
Registriert
15.03.08
Beiträge
108
Ah, so geht das also, danke, geht jetzt und die Warnings sind erst mal abgestellt. Die grundlegende, von mir gewünschte Funktionalität geht aber leider immer noch nicht. Mein Code sieht momentan wie folgt aus:
Code:
- (void)applicationDidFinishLaunching:(UIApplication *)application {    
	GeneralViewController* grav = [[GeneralViewController alloc] initWithTitle:@"" nibTitle:@"LoadScreen" height:nil];
	[window addSubview:grav.view];
	[self performSelector:@selector(showTable) withObject:self afterDelay:5];
    
	NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
	startNumber = [prefs integerForKey:@"startNumberSaved"];
	NSLog(@"%f", startNumber);
	startNumber++;
	NSLog(@"%f", startNumber);
	//[window addSubview:tabController.view];
    [window makeKeyAndVisible];
}
- (void)applicationWillTerminate:(UIApplication *)application{
	
	NSLog(@"%f", startNumber);
	[[NSUserDefaults standardUserDefaults] setInteger:startNumber forKey:@"startNumberSaved"];
	[[NSUserDefaults standardUserDefaults] registerDefaults:NULL];
}

Wenn ich das compiliere und im iPhone-Simulator starte, dann bekomme ich folgende Logs:
Code:
2010-02-02 19:17:41.211 xxxxxx[29717:20b] 0.000000      //Der Log beim Öffnen der Applikation, sie wurde zum ersten mal geöffnet, deswegen ist es legitim, das hier 0 steht
2010-02-02 19:17:41.212 xxxxxx[29717:20b] 0.000000     //der zweite Log, nach der Erhöhung des Counters um 1
2010-02-02 19:17:48.253 xxxxxx[29717:20b] -1.992287   //der Log beim beenden, was bitte ist hier passiert und warum hat er nicht um 1 erhöht vorher?!

wer findet den fehler und sagt mir was falsch ist? ich steh leider echt auf dem Schlau...:D
danke
 

sumpfmonsterjunior

Morgenduft
Registriert
17.03.05
Beiträge
167
Da startNumber eine ganzzahl ist, musst Du

Code:
NSLog( @"%d", startNumber);
schreiben, statt %f für Floatingpoint.
 

Poljpocket

Salvatico di Campascio
Registriert
07.01.07
Beiträge
432
Nur so nebenbei: Warnings abstellen ist wohl eine sehr schlechte Idee! Denn genau diese zeigen dir, dass du Fehler machst. Ein Programm sollte - dass es auch stabil laufen kann - keine Warnings produzieren, wenn man es kompiliert. Dabei ist zu sagen, dass keine warnings alles andere als hinreichend für die nötige Stabilität eines Programmes ist! :)

Gruss ppocket

PS:
Ah, so geht das also, danke, geht jetzt und die Warnings sind erst mal abgestellt. Die grundlegende, von mir gewünschte Funktionalität geht aber leider immer noch nicht
Genau das ist es ja... der compiler spuckt Warnings, weil dein Programm nicht funktionieren wird...
 

Deleted member 99757

Gast
Könnte es sein, dass der NSInteger zwischenzeitlich wieder freigegeben wurde? Probier mal mit einem NSNumber und gibt es erst im dealloc block wieder frei. Hatte sowas mal mit einem NSString.

Macht es Sinn registerDefaults beim beenden aufzurufen? Ersetz mal

[[NSUserDefaults standardUserDefaults] registerDefaults:NULL];

durch

[[NSUserDefaults standardUserDefaults] synchronize];

NSUserDefaults Class Reference
 

nelfisch

Carola
Registriert
15.03.08
Beiträge
108
mhm, okay, das problem hat sich von selber behoben, lag an dem falschen log, gezählt und so hat er richtig. allerdings habe ich mittlerweile ein zweites problem mit den userdefaults. ich habe mir einen eigenen navigationcontroller geschrieben, der "tracken" soll, welches view meiner app als letztes auf dem schirm war, wenn die app über den home-button beendet wird. dazu habe ich diesem navigationcontroller entitys gegeben, und zwar einen NSString für den NibName, einen für den Title und eine NSInteger für die size des Views(um genau zu sein: contentsize eines scroll views). die contentsizes habe ich alle in ein array gemacht, das in einem erstellten dictionary mit den sizes als values und den nibnamen als keys erzeugt wurde. wenn er speichert, speichert er ganz normal den title und den nibname über [aViewController title] / [aViewController nibName] und sucht dann aus dem dictionary mit dem key "nibName" die passende size für raus. klappt alles so ganz wunderbar, er rafft das mit den nibnames und den titles, aber mir den sizes ist irgendwie nicht ganz in ordnung, da speichert er immer 0 ab, das ist ja nicht sinn der sache....jemand ne idee?

ein bisschen code:
Code:
-(void)saveContent{
	[[NSUserDefaults standardUserDefaults] setInteger:gotSizeHeigt forKey:@"gotSizeHeigt"];
	[[NSUserDefaults standardUserDefaults] setObject:gotTitle forKey:@"gotTitle"];
	[[NSUserDefaults standardUserDefaults] setObject:gotNibName forKey:@"gotNibName"];
	
	[[NSUserDefaults standardUserDefaults] synchronize];
}
-(void)refreshContent{
	NSUserDefaults* prefs = [NSUserDefaults standardUserDefaults];
	gotTitle = [prefs objectForKey:@"gotTitle"];
	gotNibName = [prefs objectForKey:@"gotNibName"];
	gotSizeHeigt = [prefs integerForKey:@"gotSizeHeight"];
	
}
das sind die methoden zum speichern bzw. laden im navigationcontroller

Code:
-(void)pushViewController:(UIViewController*)aViewController animated:(BOOL)aBool{
	[super pushViewController:aViewController animated:aBool];
	
		
	
	gotNibName = [aViewController nibName];
	gotSizeHeigt = [[dictForCords objectForKey:gotNibName] intValue];
	gotTitle = [aViewController title];
	
	NSLog(@"gotNibName ist momentag: %@", gotNibName);
	NSLog(@"gotTitle ist momentag: %@", gotTitle);
	NSLog(@"gotSizeHeight ist momentan: %d", gotSizeHeigt);
	
	
}
das tracken des momentanigen viewcontrollers auf dem screen

dabei ist noch zusagen, dass er refreshContent des navigationControllers im appdelegate beim laden des ersten views ausführt, und die methode saveContent bei applicationWillTerminate:

*such* ;D
aber danke für die hilfe bis jetzt!