iOS programming in 2010

Jak odczytać NSArray z URLa bez blokowania aplikacji

Posted: September 14th, 2010 | Author: | Filed under: Xcode solutions | Comments Off on Jak odczytać NSArray z URLa bez blokowania aplikacji

Tworząc aplikację wyświetlającą dane z sieci bardzo często stajemy przed problemem: jak odczytać dane z pliku zewnętrznego.
Parsowanie XML w Objective-C jest bardzo pracochłonne, więc lepiej przeanalizować, czy łatwiejszym rozwiązaniem nie jest utworzyć .plist file (Property list) na serwerze i taki format pliku pobierać do aplikacji.

Warto zauważyć, że czytanie NSArray lub NSDictionary z pliku to tylko 2 linijki:

NSURL *myUrl=[NSURL URLWithString:@"https://iphone.orpi.pl/someexamplefile.plist"];
NSArray *myChartData=[NSArray arrayWithContentsOfURL:myUrl];

Pojawia się jednak problem, jeśli urządzenie na którym próbujemy odczytać plik nie ma podłączenia do internetu.
W taki przypadku myChartData zwróci nil, ale do czasu otrzymania timeout urzÄ…dzenie bÄ™dzie “wisiaÅ‚o”.
Read the rest of this entry »


Jak wyświetlić lokalizowane nazwy miesięcy?

Posted: September 14th, 2010 | Author: | Filed under: Xcode solutions | Comments Off on Jak wyświetlić lokalizowane nazwy miesięcy?

Problem wydaje się banalny, ale nie mając doświadczenia z Objective-C możemy spędzić dużo czasu szukając odpowiednich obiektów.
Przedstawiam więc gotowe rozwiązanie:

Tworzymy obiekt “Kalendarz”, który na podstawie przesÅ‚anego obiektu NSDictionary zwróci nazwÄ™ miesiÄ…ca:

Kalendarz.h
@interface Kalendarz : NSObject {
}
-(NSString *)jakiMiesiac:(NSDictionary *)rokMiesiacDzien;
@end

Kalendarz.m
@implementation Kalendarz

-(NSString *)jakiMiesiac:(NSDictionary *)rokMiesiacDzien;
{
NSInteger miesiacNumber=[[rokMiesiacDzien valueForKey:@"month"] intValue]; // tutaj odczytujemy wartość Integer miesiąca
return [[self dateCreate:miesiacNumber] autorelease];
}

-(NSString *)dateCreate:(NSInteger)month
{
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"MMMM"];
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *comps = [[NSDateComponents alloc] init];
[comps setMonth:month];

NSDate *yearDate = [gregorian dateFromComponents:comps];
NSString *miesiacName=[dateFormat stringFromDate:yearDate];

[comps release];
[gregorian release];
[dateFormat release];

return [miesiacName autorelease];
}
@end

Wywołanie obiektu i metody w naszej aplikacji:

Kalendarz *newKalendarz=[[Kalendarz alloc] init];
NSDictionary *rokMiesiacDzien=[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:miesiac+1] forKey:@"month"];
NSString *miesiacName=[[NSString alloc] initWithString:[[newKalendarz jakiMiesiac:rokMiesiacDzien] retain]];

...............

[newKalendarz release];
[miesiacName release]; // zwalniamy oczywiście dopiero po przekazaniu obiektu do miejsca gdzie będzie wyświetlany.


Jak przekazać parametr do widoku “rodzica” (parent view)

Posted: September 10th, 2010 | Author: | Filed under: Xcode solutions | Comments Off on Jak przekazać parametr do widoku “rodzica” (parent view)

Passing parameters to parent object in Objective-C Często w aplikacji posiadającej wiele widoków potrzebujemy wyświetlić dodatkowy widok, na którym użytkownik wprowadzi parametry (lub wybierze z tabeli). Chcemy tą informację wykorzystać w naszym nadrzędnym obiekcie.

Przykład:
Wyświetlany ekran kalkulatora (zobacz aplikację Savings Calculator with Tax w App Store).
Po zmianie kapitalizacji lub okresu (czyli wybraniu wartości z tabelki na innym widoku), chcemy wykonać ponownie obliczenia z uwzględnieniem zmienionych wartości.

Możemy zastosować następujące metody:
1. wykorzystujemy subview zamiast widoków i nie tworzymy dodatkowych klas.
2. wykorzystujemy Notification Center
3. Wykorzystujemy delegowanie obiektów i protokół

Omówmy poszczególne metody:
Read the rest of this entry »