Posted: September 14th, 2010 | Author: plusz | 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 »
Posted: September 14th, 2010 | Author: plusz | 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.
Posted: September 10th, 2010 | Author: plusz | 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 »