iRepair

iPhone-udvikling: Vise alert en gang

Efter en længere pause i artiklerne omkring iPhone-udvikling, starter vi op igen. Jeg var midt en artikelserie om spil-udvikling til iPhonen og lovede at næste emne ville blive “kollision”. Dette kommer næste gang, i dag starter vi stille og roligt op med en lille ting, som blandt andet har været efterspurgt i iPhoneguides forum.

Det, det skal handle om, er en situation, hvor man ønsker en alert vist en gang og kun engang, for eksempel når et program starter. Det kunne være en disclaimer eller noget andet information, der er vigtigt, men ikke så vigtigt, at brugeren hver gang skal bebyrdes med den.

Til det formål kan man bruge iPhonens mulighed for at gemme variabler som såkalde “NSUserDefaults”. Med disse kan man skrive og læse variabler. I dette tilfælde vil vi udnytte det til at vise en alert, hvis og kun hvis, den ikke har vært vist før.

Her er koden:


	NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
	if ([defaults objectForKey:@"vistAlert"]) {
		//Viser ikke alert
	} else {
		//Viser alert
		UIAlertView *alert = [[UIAlertView alloc]
			initWithTitle:@"Vejledning"
			message:@"Velkommen til. Denne besked vises kun én gang!"
			delegate:self
			cancelButtonTitle:@"OK"
			otherButtonTitles: nil];
		[alert show];
		[alert release];
		[defaults setFloat:1 forKey:@"vistAlert"];
		[defaults synchronize];

	}

Den første linie indlæser NSUserDefaults fra hukommelsen. Næste linie spørger om der er en værdi for objektet “vistAlert”. Navnet spiller ingen rolle, du kan bruge det du finder passende.

Hvis der er en værdi for vistAlert, skal der ikke gøres noget i dette tilfælde, da det betyder at alerten har været vist en gang tidligere. Der er dog andre tilfælde, hvor man gerne vil have udført noget kode. Det kunne være en anden alert, således at der første gang bliver budt velkommen, og andre gange budt velkommen tilbage etc.

Hvis der ikke er en værdi for vistAlert, vil vi gerne have vist en. Vi laver derfor en alert, viser den og frigiver den igen. Nu kommer det interessante, vi skal have gemt en værdi for vistAlert i hukommelsen. Det klarer vi med koden [defaults setFloat:1 forKey:@"vistAlert"];, der sætter værdien for objektet vistAlert til tallet 1. Man kunne også sætte den til teksten “ja” etc. I dette tilfælde skal det sådan set bare have en værdi forskellig fra nul. Til sidt synkroniserer vi defaults, så ændringen bliver gemt.

Her er hvad det resulterer i:

Første gang koden løbes igennem, er der ingen værdi for variablen vistAlert, derfor vises en alert. Næste gang koden løbes igennem, er der en værdi for vistAlert og der bliver ikke vist en alert.

Placeringen af koden afhænger selvfølgelig af hvor den skal vises. Det kunne for eksempel være i metoden viewDidLoad.

Anvendelsesmulighederne af userDefaults i almindelighed er enorme, og alene i dette tilfælde, hvor man ønsker en kodestump eksekveret en enkelt gang, er der mange muligheder. Man kunne også vise den to gange i stedet for en, ved at tjekke om vistAlert var lig 2, og så huske at lægge en til værdi, hver gang den vises. Eller at vise den hver tiende gang etc. Eksperimenter med det og meld gerne tilbage hvis du finder en ny spændende måde at bruge ovenstående kode på.

Som sagt kan userDefaults bruges til meget og jeg vil, ved en senere lejlighed, skrive en artikel kun om dette emne, hvor jeg kommer lidt mere ind på at give en forståelse af hvordan det virker, modsat dagens artikel, hvor du må tage mig på ordet, også selv du ikke forstår det.

Næste gang vender jeg tilbage med den lovede artikel om kollision i spil.

Skrevet af Martin, iPhoneguide.dk, 14/08 2009
Relaterede indlæg

Kommentarer
Subscribe to RSS
  • Nikolaj

     

    Hey Martin ja det ser vi frem til for jeg fatter ikke en bjælde af ovenstående.
    Mht donationer er jeg lidt til bageholdende, jeg donerede en del penge til iphoneinstaller tidligere og uden videre er siden lukket og ingen forklaring er givet.
    Jeg ved godt af Ratta må have sine personlige grunde til det men syntes jo af man godt kunne have givet en forklaring da vi var mange trofaste fans på hans site som havde lagt mange donationer.
    Derfor ser jeg lige dit site an også skal jeg nok begynde af støtte dit fantastiske arbejde for hvor var iphonen uden disse site 
    god weekend

    Thumb up 0

    14. august 2009 @ 10:26

  •  

    Nice artikel :D
    Nu hvor jeg læser på det, er det jo ikke særlig svært, har bare ikke lige kunne finde noget i apples doku om det :)

    Thumb up 0

    14. august 2009 @ 11:56

  •  

    Super dejligt at der kommer lidt gang i disse artikler igen, glæder mig især til kollision da jeg bruger det i de spil vi laver men måske der er en smartere tilgang til det jeg endnu ikke kender… Ville være rigtig lækkert hvis du tager lidt mere avangeret kollision styring med så man f.eks kan teste for runde objekter.

    Thumb up 0

    14. august 2009 @ 11:57

  •  

    @Nikolaj – Nu er iPhoneguide noget ældre og meget større end iPhoneinstaller var – tvivler på Martin vil kaste håndklædet i ringen, når det hårde arbejde endelig bærer frugt.

    Og fin artikel, nyder dem virkelig – og super godt til nybegyndere som mig! :)

    Thumb up 0

    15. august 2009 @ 00:36

  •  

    Måske skulle der være en knap på menuen (den iphoneguide.dk har “Nyheder, Unlock , Forum osv.” hvor alle xcode guides er :)

    Thumb up 0

    15. august 2009 @ 11:10

  •  

    Er der nogle der ved om det er mugligt at resette NSUserDefaults fra settings bundle?

    Thumb up 0

    15. august 2009 @ 20:16

  •  

    Drudoo,

    hvis du sletter app’en forsvinder defaults for den…

    Thumb up 0

    17. august 2009 @ 12:59

  •  

    yea, know. men ville gerne have en knap hvor man selv kan resette den.

    Thumb up 0

    17. august 2009 @ 13:05

  •  

    @Drudoo

    Du laver bare en knap, der kalder en metode, hvor du sætter variablen “vistAlert” til 0 igen – præcist som den sættes til 1 i eksemplet.

    Thumb up 0

    17. august 2009 @ 13:18

  •  

    Dvs noget i denne retning:


    - (IBAction) resetVistAlert:(id) sender {
    [defaults setFloat:0 forKey:@"vistAlert"];
    [defaults synchronize];
    }

    Thumb up 0

    17. august 2009 @ 13:26

  •  

    Ah ofc, takker :)

    Thumb up 0

    17. august 2009 @ 13:32

  •  

    Jeg skal dog ikke kunne sige, om der er en generel måde at slette alle defauls på, på én gang. Det kunne jo også være relevant.

    Thumb up 0

    17. august 2009 @ 13:49

Skriv en kommentar

For at kommentere skal du udfylde navn og mailadresse. Du kan også oprette en profil på siden. Du finder registreringsformen nederst i sidebaren i højre side (klik på "Opret").