Strona używa cookies (ciasteczek). Dowiedz się więcej o celu ich używania i zmianach ustawień. Korzystając ze strony wyrażasz zgodę na używanie cookies, zgodnie z aktualnymi ustawieniami przeglądarki.    X

Prosta aplikacja DP dla iOS

Po przeczytaniu wpisu użytkownika SunriSebi postanowiłem napisać podobną aplikację dla systemu iOS. Pokażę tutaj podstawy tworzenia aplikacji na tą platformę. Aby zacząć programować dla iOS, musimy pobrać środowisko programistyczne Xcode ze strony http://developer.apple.com/ lub z Mac App Store.

Start

Na początku tworzymy nowy projekt (File -> New -> New project...) i wybieramy Master-Detail Application (z iOS -> Application). Później wpisujemy nazwę projektu oraz wybieramy typ urządzenia i potrzebne nam funkcje.

Jeżeli wybraliśmy takie opcje, jak te widoczne na obrazku, powinny nam się utworzyć dwa widoki. Pierwszy widok MasterViewController.xib zawiera już tabelę, w której będą znajdować się dane. Drugi widok DetailViewController.xib będzie wyświetlał dane dotyczące wybranego elementu.

Widok tabeli

Kod

Najpierw obiekty, które będą nam potrzebne przy parsowaniu oraz przy przechowywaniu danych.
W pliku MasterViewController.h:@property (nonatomic, retain) NSMutableArray *listData; @property (nonatomic, retain) NSMutableDictionary *currentElement; @property (nonatomic, retain) NSMutableString *currentValue;

W pliku MasterViewController.m:@synthesize listData; @synthesize currentElement; @synthesize currentValue;Obiekt listData będzie przechowywał dane pobrane z RSS, które będą użyte w tabeli.
Obiekt currentElement będzie tymczasowo przechowywał informacje o jednym wpisie.
Obiekt currentValue będzie tymczasowo przechowywał przy parsowaniu jedną wartość.

- (void)viewDidLoad { [super viewDidLoad]; listData = [[NSMutableArray alloc] init]; NSURL *url = [NSURL URLWithString:@"http://feeds.feedburner.com/dobreprogramy/Aktualnosci?format=xml"]; NSXMLParser *nsXMLParser = [[NSXMLParser alloc] initWithContentsOfURL:url]; [nsXMLParser setDelegate:self]; [nsXMLParser parse]; } - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict { if ([elementName isEqualToString:@"item"]) { currentElement = [[NSMutableDictionary alloc] init]; } else { currentValue = [NSMutableString string]; } } - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { if ([elementName isEqualToString:@"item"]) { [listData addObject:currentElement]; } else { if ([elementName isEqualToString:@"pubDate"]) { currentValue = [NSMutableString stringWithFormat:@"%@ %@", [currentValue substringToIndex:10], [currentValue substringWithRange:NSMakeRange(11, 5)]]; } [currentElement setValue:currentValue forKey:elementName]; } } - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { if (self.currentValue) { if (![string isEqualToString:@"<"] && ![string isEqualToString:@">"]) { NSRange range = [string rangeOfString:@"img src"]; if (range.location == NSNotFound) { [currentValue appendString:string]; } } } }Metoda viewDidLoad wykonywana jest po załadowaniu widoku. Wtedy tworzymy obiekt NSXMLParser. Podczas parsowania wywoływane są 3 eventy: didStartElement, didEndElement oraz foundCharacters. Dwa pierwsze są wykonywane, gdy parser zaczyna lub kończy przetwarzać dany element (tag). Dzięki foundCharacters możemy pobrać daną wartość. Przy evencie didEndElement informacja jest przenoszona do tablicy listData. - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return [listData count]; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]; cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; } id item = [listData objectAtIndex:indexPath.row]; cell.textLabel.text = [item valueForKey:@"title"]; cell.detailTextLabel.text = [item valueForKey:@"pubDate"]; return cell; } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { self.detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil]; [self.detailViewController setDetailItem:[listData objectAtIndex:indexPath.row]]; [self.navigationController pushViewController:self.detailViewController animated:YES]; } Za pomocą numberOfRowsInSection ustalamy ilość wpisów w tabeli. Korzystając z cellForRowAtIndexPath ustawiamy dla danego wiersza tytuł i podtytuł. didSelectRowAtIndexPath pozwala na wykonanie danej akcji po kliknięciu na wiersz tabeli.
Po zmianach nasz kod powinien wyglądać tak:

Widok szczegółowy

Kod

W pliku DetailViewController.h dodajemy:

@property (strong, nonatomic) IBOutlet UITextView *newsDescription; @property (strong, nonatomic) IBOutlet UILabel *newsTitle; @property (strong, nonatomic) IBOutlet UILabel *newsAuthor; W pliku DetailViewController.m dodajemy:@synthesize newsTitle, newsDescription, newsAuthor;Dodaliśmy tutaj obiekty, które będą odpowiadać za kontrolę odpowiednich elementów interfejsu. - (void)configureView { if (self.detailItem) { self.title = [self.detailItem valueForKey:@"title"]; self.newsTitle.text = [self.detailItem valueForKey:@"title"]; self.newsAuthor.text = [NSString stringWithFormat:@"Dodano: %@, Autor: %@", [[self.detailItem valueForKey:@"pubDate"] substringToIndex:16], [self.detailItem valueForKey:@"author"]]; self.newsDescription.text = [self.detailItem valueForKey:@"description"]; } } Metoda configureView ustawia w widoku takie rzeczy jak tytuł oraz opis.
Po zmianach nasz kod powinien wyglądać tak:

Interfejs

W pliku DetailViewController.xib dodajmy 3 kontrolki (2x UILabel, 1xUITextView) przeciągając je z listy obok.

Teraz klikamy prawym przyciskiem myszy na "File's owner" i łączymy dodane już wcześniej w kodzie obiekty z kontrolkami.

Dzięki zmapowaniu obiektów z kontrolkami, kod może teraz sterować interfejsem.

Podsumowanie

Jeżeli wszystko poszło tak jak trzeba, to powinniśmy po skompilowaniu zobaczyć taką aplikację:

 

oprogramowanie urządzenia mobilne hobby

Komentarze

0 nowych
meron11   4 #1 23.12.2011 22:13

Pod GNU, WIndowsem nadal nie mozna pisać dla IOS?

  #2 23.12.2011 22:20

Jeśli ktoś chce pisać na poważnie na iOS to logiczne jest to, że musi posiadać urządzenie z jabłuszkiem ;-)

dominikc   5 #3 23.12.2011 22:24

@meron11
Nie da się, tak samo jak trzeba mieć Windows, aby korzystać z Visual Studio. Jedynie Android jest wieloplatformowy.

meron11   4 #4 23.12.2011 22:28

I MeeGO któ¶ego jestem zwolennikiem, tylko szkoda że na n9 zagoscił.....

meron11   4 #5 23.12.2011 22:28

^że tylno na n9

kuba144   5 #6 23.12.2011 23:00

To teraz czekam na Androida :P

dominikc   5 #7 23.12.2011 23:05

@kuba144
Hmm, w sumie mógłbym napisać na Androida. Albo na Windows Phone :) Jak znajdę czas, to coś napiszę.

  #8 24.12.2011 10:06

Ja rozumiem kod. Rozumiem z niego, że kolega blokuje główny wątek do pobrania pliku z sieci, co przy uruchomieniu programu nie da zbyt dobrego wrażenia. Program nie będzie odpowiadał jeśli tylko będzie jakiś problem z siecią... Co oznacza wylot z App Store ;)

  #9 24.12.2011 12:07

Do tego dochodzi fakt, że na DP raczej mało makowców a jeśli już to tylko nieliczni mają coś wspólnego z programowaniem a jak już to najczęściej jest to jakieś PHP czy inne do tworzenia stron ;)

dominikc   5 #10 24.12.2011 16:33

@ios.janmazurczak.pl
Wiem, nie dodałem obsługi wyjątków, etc. Ogólnie pisałem kod na szybko, żeby tylko pokazać sposób tworzenia aplikacji na iOS.

Animatter   3 #11 24.12.2011 17:53

Wrzuć do App Store, chętnie bym poużywał na telefonie:)

dominikc   5 #12 24.12.2011 19:13

@Animatter
Raczej to nie nadaje się do App Store. Tu chciałem pokazać prostą aplikację, która pobiera dane z RSS.

SunriSebi   4 #13 26.12.2011 09:44

Fajny wpis :)