1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen
  2. Unsere jährliche Weihnachts-Banner-Aktion hat begonnen! Wir freuen uns auf viele, viele kreative Vorschläge.
    Mehr dazu könnt Ihr hier nachlesen: Weihnachtsbanner 2016

    Information ausblenden

Startzahl der App in NSUserDefaults speichern

Dieses Thema im Forum "iOS-Developer" wurde erstellt von nelfisch, 02.02.10.

  1. nelfisch

    nelfisch Carola

    Dabei seit:
    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 :)
     
  2. sumpfmonsterjunior

    sumpfmonsterjunior Morgenduft

    Dabei seit:
    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;
    ...
    
     
  3. nelfisch

    nelfisch Carola

    Dabei seit:
    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
     
  4. sumpfmonsterjunior

    sumpfmonsterjunior Morgenduft

    Dabei seit:
    17.03.05
    Beiträge:
    167
    Da startNumber eine ganzzahl ist, musst Du

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

    Poljpocket Salvatico di Campascio

    Dabei seit:
    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:
    Genau das ist es ja... der compiler spuckt Warnings, weil dein Programm nicht funktionieren wird...
     
  6. Duck Dodgers

    Duck Dodgers Reinette de Champagne

    Dabei seit:
    06.12.09
    Beiträge:
    419
    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
     
  7. nelfisch

    nelfisch Carola

    Dabei seit:
    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!
     

Diese Seite empfehlen