Blog (7)
Komentarze (211)
Recenzje (0)

Prosta aplikacja DP dla iOS

@dominikcProsta aplikacja DP dla iOS23.12.2011 21:17

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ę:

Szanowna Użytkowniczko! Szanowny Użytkowniku!
×
Aby dalej móc dostarczać coraz lepsze materiały redakcyjne i udostępniać coraz lepsze usługi, potrzebujemy zgody na dopasowanie treści marketingowych do Twojego zachowania. Twoje dane są u nas bezpieczne, a zgodę możesz wycofać w każdej chwili na podstronie polityka prywatności.

Kliknij "PRZECHODZĘ DO SERWISU" lub na symbol "X" w górnym rogu tej planszy, jeżeli zgadzasz się na przetwarzanie przez Wirtualną Polskę i naszych Zaufanych Partnerów Twoich danych osobowych, zbieranych w ramach korzystania przez Ciebie z usług, portali i serwisów internetowych Wirtualnej Polski (w tym danych zapisywanych w plikach cookies) w celach marketingowych realizowanych na zlecenie naszych Zaufanych Partnerów. Jeśli nie zgadzasz się na przetwarzanie Twoich danych osobowych skorzystaj z ustawień w polityce prywatności. Zgoda jest dobrowolna i możesz ją w dowolnym momencie wycofać zmieniając ustawienia w polityce prywatności (w której znajdziesz odpowiedzi na wszystkie pytania związane z przetwarzaniem Twoich danych osobowych).

Od 25 maja 2018 roku obowiązuje Rozporządzenie Parlamentu Europejskiego i Rady (UE) 2016/679 (określane jako "RODO"). W związku z tym chcielibyśmy poinformować o przetwarzaniu Twoich danych oraz zasadach, na jakich odbywa się to po dniu 25 maja 2018 roku.

Kto będzie administratorem Twoich danych?

Administratorami Twoich danych będzie Wirtualna Polska Media Spółka Akcyjna z siedzibą w Warszawie, oraz pozostałe spółki z grupy Wirtualna Polska, jak również nasi Zaufani Partnerzy, z którymi stale współpracujemy. Szczegółowe informacje dotyczące administratorów znajdują się w polityce prywatności.

O jakich danych mówimy?

Chodzi o dane osobowe, które są zbierane w ramach korzystania przez Ciebie z naszych usług, portali i serwisów internetowych udostępnianych przez Wirtualną Polskę, w tym zapisywanych w plikach cookies, które są instalowane na naszych stronach przez Wirtualną Polskę oraz naszych Zaufanych Partnerów.

Dlaczego chcemy przetwarzać Twoje dane?

Przetwarzamy je dostarczać coraz lepsze materiały redakcyjne, dopasować ich tematykę do Twoich zainteresowań, tworzyć portale i serwisy internetowe, z których będziesz korzystać z przyjemnością, zapewniać większe bezpieczeństwo usług, udoskonalać nasze usługi i maksymalnie dopasować je do Twoich zainteresowań, pokazywać reklamy dopasowane do Twoich potrzeb. Szczegółowe informacje dotyczące celów przetwarzania Twoich danych znajdują się w polityce prywatności.

Komu możemy przekazać dane?

Twoje dane możemy przekazywać podmiotom przetwarzającym je na nasze zlecenie oraz podmiotom uprawnionym do uzyskania danych na podstawie obowiązującego prawa – oczywiście tylko, gdy wystąpią z żądaniem w oparciu o stosowną podstawę prawną.

Jakie masz prawa w stosunku do Twoich danych?

Masz prawo żądania dostępu, sprostowania, usunięcia lub ograniczenia przetwarzania danych. Możesz wycofać zgodę na przetwarzanie, zgłosić sprzeciw oraz skorzystać z innych praw wymienionych szczegółowo w polityce prywatności.

Jakie są podstawy prawne przetwarzania Twoich danych?

Podstawą prawną przetwarzania Twoich danych w celu świadczenia usług jest niezbędność do wykonania umów o ich świadczenie (tymi umowami są zazwyczaj regulaminy). Podstawą prawną przetwarzania danych w celu pomiarów statystycznych i marketingu własnego administratorów jest tzw. uzasadniony interes administratora. Przetwarzanie Twoich danych w celach marketingowych realizowanych przez Wirtualną Polskę na zlecenie Zaufanych Partnerów i bezpośrednio przez Zaufanych Partnerów będzie odbywać się na podstawie Twojej dobrowolnej zgody.