Posted: July 26th, 2010 | Author: anders | Filed under: iphone | Tags: coredata, iphone, iphone simulator, xcode | No Comments »
När jag skulle initera mina CoreData-lagringen med:
[persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:url options:nil error:&error]
Fick jag följande fel:
Error Operation could not be completed. (Cocoa error 134100.)
När du ändrat i dina CoreData-modeller så blir det alltid fel och det brukar normalt räcka med att köra en reset på iPhone Simulator, men den här gången räckte det inte. En timme senare inser jag att det här behöves köra en “Clean all targets” så fungerade allt igen. Litet litet tips…
Posted: June 6th, 2010 | Author: anders | Filed under: iphone | Tags: c, iphone, objective-c, strängar, strings, xcode | No Comments »
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.
Posted: May 14th, 2010 | Author: anders | Filed under: iphone | Tags: coredata, iphone, objective-c, xcode | No Comments »
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.
Posted: April 26th, 2010 | Author: anders | Filed under: iphone | Tags: apple, debug, iphone, iphone simulator, xcode | No Comments »
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.
Posted: April 20th, 2010 | Author: anders | Filed under: iphone | Tags: iphone, iphone sdk, objective-c, xcode | No Comments »
Här kommer ett kort tips för att snabbt få rundade hörn på bilder i din app. Börja med att importera QuartsCore:
#import <QuartzCore/QuartzCore.h>
Sen räcker det med följande kod:
[imageView.layer setMasksToBounds:YES];
[imageView.layer setCornerRadius:5.0];
Posted: April 17th, 2010 | Author: anders | Filed under: iphone | Tags: iphone, iphone sdk, objective-c, xcode | No Comments »

iPhone-appar med många bilder som kanske uppdateras under utvecklingsarbetet kan ställa till det. Det finns två metoder i XCode för att hålla reda på resurser – antingen med mappreferenser eller enkelt grupperat – båda medför problem. Särskilt när du uppdaterar redan existerande bilder.

Efter att manuellt ha lagt till eller tagit bort filer hittade jag den här artikeln på majicjungle.com som innehåller en smidig lösning. Det går ut på att du lägger till ett skript som körs varje gång du kompilerar. Scriptet kör bara en “touch” på resurskatalogen med exempelvis bilder, vilket leder till att XCode ser att katalogen är uppdaterad och tar med den nya versionen i bundle:n.
För att lägga till scriptet så behöver du bara:
- Högerklicka på din target, välj “New Run Script Build Phase” enligt bilden ovan.
- Byt shell till tcsh och gör en touch på din resurskatalogs sökväg, baserat på var den ligger i förhållande till projektfilen (se bild). I mitt fall lägger jag dem oftast i samma katalog och skriver därför följande: touch -cm ${SRCROOT}/Resources
- Flytta ordningen så att scriptet körs först av allt i the build phase (se bild).

- Klart!
För mig fungerade det här klockrent både vid skapande och uppdatering av bildresurser. Hur fungerar det för er? Ni kanske har något annat tips?
Posted: April 16th, 2010 | Author: anders | Filed under: iphone | Tags: iphone, policy error, Utveckling, xcode | 1 Comment »
Känner ni igen felmeddelandet när ni ska testa din app på iPhone?
Error launching remote program: security policy error.
The program being debugged is not being run.
Du kan ha ställt in allting rätt för din profile, men det fungerar ändå inte.
Det kanske är fler som listat ut att det räcker med en enda “expired” provisioning profile för att det inte ska fungera. Det behöver inte ens vara profile:n för just den appen du ska köra – det fungerar ändå inte. Lösningen är dock enkel – det är bara att ta bort den profile:n som har gått ut så fungerar det igen.