25.2.2011
strana 1
iOS Cvičení RSS čtečka Jiří Kamínek
[email protected]
25.2.2011
strana 2
Vytvoření nového projektu v XCode • Název – RSSLesson
• Navigation-based Application • use Core Data for storage – nezaškrtávat
25.2.2011
strana 3
Vytvoření modelu
Živě.cz http://www.zive.cz/default.aspx <description> cs Mon, 7 Mar 2011 20:00:00 GMT Živě.cz http://www.zive.cz/Client.Images/Logos/logo-zive-rss.gif http://www.zive.cz/default.aspx -
Western Digital zaplatí 4,3 miliardy dolarů za výrobu disků Hitachi http://www.zive.cz/bleskovky/western-digital-zaplati-43-miliardy-dolaru-za-vyrobu-disku-hitachi/sc-4-a-156126/default.aspx http://www.zive.cz/default.aspx?article=156126 <description> Mezi výrobci pevných disků dojde k důležitému spojení sil. Světová dvojka Western Digital koupí divizi pevných disků společnosti Hitachi, uvedl to Western Digital v dnešní tiskové zprávě . Koupě vyjde na 4,3 miliardy dolarů a měla by z Western Digital udělat největšího výrobce pevných disků a ... Mon, 7 Mar 2011 17:01:00 GMT
25.2.2011
strana 4
Vytvoření modelu
-
Western Digital zaplatí 4,3 miliardy dolarů za výrobu disků Hitachi http://www.zive.cz/bleskovky/western-digital-zaplati-43miliardy-dolaru-za-vyrobu-disku-hitachi/sc-4-a-156126/default.aspx link> <description> Mezi výrobci pevných disků dojde k důležitému spojení sil. Světová dvojka Western Digital koupí divizi pevných disků společnosti Hitachi, uvedl to Western Digital v dnešní tiskové zprávě . Koupě vyjde na 4,3 miliardy dolarů a měla by z Western Digital udělat největšího výrobce pevných disků a ... Mon, 7 Mar 2011 17:01:00 GMT
25.2.2011
strana 5
XML parser • SAX – Simple API for XML • DOM – Document Object Model
25.2.2011
strana 6
RSSProcessor.h Protokol
- (void) parseRSSFeedAtUrl:(NSString*)urlAddress;
25.2.2011
strana 7
RSSProcessor.h id delegate; NSXMLParser * rssParser; NSMutableArray * stories; NSMutableDictionary * item; NSString * currentElement; NSMutableString * currentTitle, * currentDate, * currentSummary, * currentLink;
25.2.2011
strana 8
RSSProcessor.m - (id) init { if (self = [super init]) { stories = [[NSMutableArray alloc] init]; } return self; }
25.2.2011
strana 9
RSSProcessor.m - (void)dealloc { [stories release]; [super dealloc]; }
25.2.2011
strana 10
RSSProcessor.m - (void) parseRSSFeedAtUrl:(NSString*)urlAddress; { //you must then convert the path to a proper NSURL or it won't work NSURL *xmlURL = [NSURL URLWithString:urlAddress]; rssParser = [[NSXMLParser alloc] initWithContentsOfURL:xmlURL]; // Set self as the delegate of the parser so that it will receive the parser delegate methods callbacks. [rssParser setDelegate:self]; [rssParser parse]; }
25.2.2011
strana 11
RSSProcessor.m - (void)parser:(NSXMLParser *)parser parseErrorOccurred: (NSError *)parseError { NSLog(@"error parsing XML"); }
25.2.2011
strana 12
RSSProcessor.m - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *) qName attributes:(NSDictionary *)attributeDict{ currentElement = [elementName copy]; if ([elementName isEqualToString:@"item"]) { // clear out our story item caches... item = [[NSMutableDictionary alloc] init]; currentTitle = [[NSMutableString alloc] init]; currentDate = [[NSMutableString alloc] init]; currentSummary = [[NSMutableString alloc] init]; currentLink = [[NSMutableString alloc] init]; } }
25.2.2011
strana 13
RSSProcessor.m - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *) qName{ if ([elementName isEqualToString:@"item"]) { // save values to an item, then store that item into the array... [item setObject:currentTitle forKey:@"title"]; [item setObject:currentLink forKey:@"link"]; [item setObject:currentSummary forKey:@"summary"]; [item setObject:currentDate forKey:@"date"]; [stories addObject:[item copy]]; NSLog(@"adding story: %@", currentTitle); } }
25.2.2011
strana 14
RSSProcessor.m - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{ // save the characters for the current item... if ([currentElement isEqualToString:@"title"]) { [currentTitle appendString:string]; } else if ([currentElement isEqualToString:@"link"]) { [currentLink appendString:string]; } else if ([currentElement isEqualToString:@"description"]) { [currentSummary appendString:string]; } else if ([currentElement isEqualToString:@"pubDate"]) { [currentDate appendString:string]; } }
25.2.2011
strana 15
RSSProcessor.m - (void)parserDidEndDocument:(NSXMLParser *) parser { NSLog(@"all done!"); [delegate setItems:stories]; [[_delegate tableView] reloadData]; }
25.2.2011
strana 16
Zobrazení výsledku
25.2.2011
strana 17
MainWindow.xib • Nadpis – RSS Lesson
25.2.2011
strana 18
RootViewController.xib • UITableView
25.2.2011
strana 19
RootViewController.h NSArray *items; @property (nonatomic, copy) NSArray *items;
25.2.2011
strana 20
RootViewController.m @synthesize items;
25.2.2011
strana 21
RootViewController.m - (NSInteger)tableView:(UITableView *) tableView numberOfRowsInSection: (NSInteger)section return [items count];
25.2.2011
strana 22
RootViewController.m - (UITableViewCell *)tableView:(UITableView *) tableView cellForRowAtIndexPath:(NSIndexPath *) indexPath [cell.textLabel setText:[[items objectAtIndex:indexPath.row] valueForKey:@"title"]];
25.2.2011
strana 23
RootViewController.m - (void)viewDidLoad items = nil; RSSProcessor *rssProcessor = [[[RSSProcessor alloc] initWithDelegate:self] autorelease]; [rssProcessor parseRSSFeedAtUrl:@"http:// www.zive.cz/system/RSS.xml"]; //#import "RSSPRocessor.h"
25.2.2011
strana 24
Protokol • Lepší řešení • Model musí mít znalost controlleru
25.2.2011
strana 25
ItemProtocol.h @protocol ItemProtocol - (void) updateItemSource:(NSArray*)itemArray; @end
25.2.2011
strana 26
RSSProcessor.h #import "ItemProtocol.h" id delegate; @property (retain) id delegate;
//@synthesize
25.2.2011
strana 27
RootViewController.h #import "ItemProtocol.h" @interface RootViewController : UITableViewController
25.2.2011
strana 28
RSSProcessor.m - (void)parserDidEndDocument:(NSXMLParser *) parser { NSLog(@"all done!"); [delegate updateItemSource:stories]; }
25.2.2011
strana 29
RootViewController - (void) updateItemSource:(NSArray*)itemArray { [self setItems:itemArray]; [[self tableView] reloadData]; }
25.2.2011
strana 30
Zobrazení detailu? • Přejdeme na web
25.2.2011
strana 31
Přidáme nový View • Classes -> Add -> New file… • Cocoa Touch Class • With XIB for user interface • WebController.h
25.2.2011
strana 32
WebController.h Protokol IBOutlet UIWebView *_webView; NSString *urlAddress; @property (nonatomic, copy) NSString *urlAddress;
25.2.2011
strana 33
WebController.m • @synthesize urlAddress;
25.2.2011
strana 34
WebController.m - (void)viewDidLoad self.title = @"Web";
25.2.2011
strana 35
WebController.m - (void)viewWillAppear:(BOOL)animated{ NSURL *url = [NSURL URLWithString:[urlAddress stringByReplacingOccurrencesOfString:@" " withString:@""]]; NSURLRequest *request = [NSURLRequest requestWithURL:url]; [_webView loadRequest:request]; [_webView setDelegate:self]; [_webView loadRequest:request]; }
25.2.2011
strana 36
WebController.m - (void)viewWillDisappear:(BOOL)animated{ NSURL *url = [NSURL URLWithString:@"about:blank"]; NSURLRequest *request = [NSURLRequest requestWithURL:url]; [_webView loadRequest:request]; }
25.2.2011
strana 37
Zobrazený web
25.2.2011
strana 38
RootViewController.m: - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath WebController *detailViewController = [[WebController alloc] initWithNibName:@"WebController" bundle:[NSBundle mainBundle]]; [detailViewController setUrlAddress:[[items objectAtIndex:indexPath.row] valueForKey:@"link"]]; [self.navigationController pushViewController:detailViewController animated:YES]; [detailViewController release];
25.2.2011
strana 39
Web na celou obrazovku [_webView setScalesPageToFit:YES];
25.2.2011
strana 40
StatusBar – indikátor načítání
25.2.2011
strana 41
WebController.m - (void)webViewDidStartLoad:(UIWebView *)webView { UIApplication* app = [UIApplication sharedApplication]; app.networkActivityIndicatorVisible = YES; }
25.2.2011
strana 42
WebController.m - (void)webViewDidFinishLoad:(UIWebView *)webView { UIApplication* app = [UIApplication sharedApplication]; app.networkActivityIndicatorVisible = NO; } - (void)webView:(UIWebView *)webView didFailLoadWithError: (NSError *)error { UIApplication* app = [UIApplication sharedApplication]; app.networkActivityIndicatorVisible = NO; }
25.2.2011
strana 43
Rychlé zobrazení detailu
25.2.2011
strana 44
Rychlé zobrazení detailu • Classes -> Add -> New file… • Cocoa Touch Class • With XIB for user interface • DetailViewController.h
25.2.2011
strana 45
DetailViewController.h IBOutlet UILabel *titleLabel; IBOutlet UILabel *timeLabel; IBOutlet UITextView *textView; NSString *url;
@property (nonatomic, retain) IBOutlet UILabel *titleLabel; @property (nonatomic, retain) IBOutlet UILabel *timeLabel; @property (nonatomic, retain) IBOutlet UITextView *textView; @property (nonatomic, retain) NSString *url;
25.2.2011
strana 46
DetailViewController.h @synthesize titleLabel, timeLabel, textView, url;
25.2.2011
strana 47
DetailViewController.m - (void)viewDidLoad self.title = @"RSS Detail";
25.2.2011
strana 48
DetailViewController.h IBOutlet UILabel *titleLabel; IBOutlet UILabel *timeLabel; IBOutlet UITextView *textView; NSString *url;
@property (nonatomic, retain) IBOutlet UILabel *titleLabel; @property (nonatomic, retain) IBOutlet UILabel *timeLabel; @property (nonatomic, retain) IBOutlet UITextView *textView; @property (nonatomic, retain) NSString *url;
25.2.2011
strana 49
DetailViewController.m //pridat do (.h) //- (IBAction) showWeb - (IBAction) showWeb { WebController *detailViewController = [[WebController alloc] initWithNibName:@"WebController" bundle:[NSBundle mainBundle]]; [detailViewController setUrlAddress:url]; [self.navigationController pushViewController:detailViewController animated:YES]; [detailViewController release]; }
25.2.2011
strana 50
Rychlé zobrazení detailu
25.2.2011
strana 51
DetailViewController.m DetailViewController *detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:[NSBundle mainBundle]]; [self.navigationController pushViewController:detailViewController animated:YES]; NSString *l = [[items objectAtIndex:indexPath.row] valueForKey:@"link"]; [detailViewController setUrl:l]; NSString *t = [[items objectAtIndex:indexPath.row] valueForKey:@"title"]; [[detailViewController titleLabel] setText:t]; NSString *s = [[items objectAtIndex:indexPath.row] valueForKey:@"summary"]; [[detailViewController textView] setText:s]; NSString *d = [[items objectAtIndex:indexPath.row] valueForKey:@"date"]; [[detailViewController timeLabel] setText:d]; [detailViewController release];
25.2.2011
strana 52
Více RSS zdrojů? RootViewController.m RSSProcessor *secondRssProcessor = [[[RSSProcessor alloc] initWithDelegate:self] autorelease]; [secondRssProcessor parseRSSFeedAtUrl:@"http:// www.ceskenoviny.cz/sluzby/rss/index.php"];
25.2.2011
strana 53
Více RSS zdrojů? - (void)parserDidEndDocument:(NSXMLParser *)parser { NSLog(@"all done!"); NSMutableArray *tmpArray = [[[NSMutableArray alloc] init] autorelease]; [tmpArray addObjectsFromArray:[_delegate items]]; [tmpArray addObjectsFromArray:stories]; [_delegate setItems:tmpArray]; }
25.2.2011
strana 54
Děkuji za pozornost!