Semi-localization

Skrevs: June 6th, 2010 | Av: anders | Kategori: iphone | Taggad: , , , , , | Inga kommentarer »

För att byta mellan set av strängar kan du antingen göra en fullfjädrad localization. Ett alternativ att använda hantera strängar och språk manuellt i appen. Du kanske bara vill hantera olika sträng-set på ett överskådligt och uppdelat sätt.

Skapa en strings-fil:

Välj New File -> Strings File och döp filen till något du känner igen. Om det handlar om att separera språk så kan du exempelvis kalla den se.strings eller en.strings.

Sen fyller du på med nycklelvärden och strängar enligt:

/* se.strings */

/* urlar */

“baseurl” = “http://www.någonurlfördethärspråket.com”;

/* base menu */

“start” = “Hem”;

“settings” = “Inställningar”;

Notera semikolon i slutet av varje rad.

Hämta ut strängar från strings-filer:

Om du sedan vill hämta ut någon sträng – exempelvis “start”-strängen vilken ska översättas till “Hem” (i från ovan fil som heter se.strings) använder du bara:

NSLocalizedStringFromTable(@”start”, @”se”, nil);

Det första värdet är alltså namnet på “nyckeln”, det andra vilken fil, eller tabell, du vill läsa ifrån.


Override på en Coredata-objekt setter

Skrevs: May 14th, 2010 | Av: anders | Kategori: iphone | Taggad: , , , | Inga kommentarer »

Om du skapat ett Coredata-objekt med en uppsättning attribut och automat-genererat en klass kan det hända att du vill ändra en set-funktion. I mitt fall ville jag exempelvis nyligen uppdatera “tid för senaste updatering” samtidigt som jag favorit-markerade ett objekt.

I och med att alla Coredata-attribut är @dynamic kan du inte sätta värden som om det vore en vanlig @property utan du använder dig av Key Value Coding:

-(void) setFavourite:(NSNumber *) newFav {

[self willChangeValueForKey:@"favourite"];

[self setPrimitiveValue:newFav forKey:@"favourite"];

[self didChangeValueForKey:@"favourite"];

[self timestamp];

}

Det viktiga här är, för det första, att du använder willChangeValueForKey och didChangeValueForKey. Sen kan du använda setValue: forKey: vilket jag fått att fungera för NSString-attribut, men inte för NSNumber – så använd setPrimitiveValue: forKey: istället. Vad jag förstått är det generellt att föredra.

Då vi ändå är inne på key values så tänkte jag tipsa om key-paths. Letade rätt på en bloggpost som visar lite saker du kan använda det till – exempelvis smidigt söka igenom en NSArray eller NSDictionary.


XCode och resurser igen

Skrevs: April 26th, 2010 | Av: anders | Kategori: iphone | Taggad: , , , , | Inga kommentarer »

Efter att ha rensat upp och strukturerat om min projektfil och tillhörande resurser slutade mitt projekt helt plötsligt att fungera. Det enda felmeddelandet jag fick upp var:

Failed to launch simulated application: Unknown error.

Efter att ha spenderat någon timme med att lista ut varför, kollat /var/log/system.log och googlat inser jag att många har haft samma problem, men inte alla hittar lösningen. Vanligtvis kan det räcka med att tömma cache:n i XCode eller reset:a iPhone Simulator, men i mitt fall räcker det inte.

Vad löste då problemet?

Jo, det var så enkelt som att vissa mappnamn inte är okej. Jag hade först döpt en resurs-mapp, som använder sig av folder-references, till Resources och därefter ExternalResources – båda vållade problem. Sen döpte jag mappen till samma namn som appen vilket också gav problem tills jag slutligen valde namnet Material. Och helt plötsligt fungerar projektet precis som det ska.

Konstigt att XCode inte kan ge ett korrekt felmeddelande när man försöker kompilera och testköra, men nu vet jag åtminstone att jag inte ska döpa externa resursmappar till något med resources eller något som innehåller app-namnet.