Blog (7)
Komentarze (211)
Recenzje (0)
@dominikcProsta aplikacja DP dla iOS

Prosta aplikacja DP dla iOS

23.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.

401407

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:

401420

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:

401430

Interfejs

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

401433

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

401435

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

401439
Wybrane dla Ciebie
Komentarze (13)