(1)XML 数据请求
使用 AFNetworking 中的 AFHTTPRequestOperation 和 AFXMLParserResponseSerializer,另外结合第三方框架 XMLDictionary 进行数据转换
使用 XMLDictionary 的好处:有效避免自行实现 NSXMLParserDelegate 委托代理协议方法来进行繁琐的数据拼凑解析
(2)JSON 数据请求
使用 AFNetworking 中的 AFHTTPRequestOperation 或 AFHTTPRequestOperationManager,另外在图片缓存方面可选的方案有:
- 使用 AFNetworking 中 的 UIImageView+AFNetworking
- 使用第三方框架 SDWebImage 的 UIImageView+WebCache
效果如下:
XML 数据格式:
请求网址:http://www.webxml.com.cn/WebServices/WeatherWebService.asmx/getWeatherbyCityName?theCityName=59287
1 <ArrayOfString xmlns="http://WebXml.com.cn/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 2 <string> 3 广东 4 </string> 5 <string> 6 广州 7 </string> 8 <string> 9 59287 10 </string> 11 <string> 12 59287.jpg 13 </string> 14 <string> 15 2015-9-19 17:30:31 16 </string> 17 <string> 18 25℃/32℃ 19 </string> 20 <string> 21 9月19日 多云转中雨 22 </string> 23 <string> 24 无持续风向微风 25 </string> 26 <string> 27 1.gif 28 </string> 29 <string> 30 8.gif 31 </string> 32 <string> 33 今日天气实况:气温:31℃;风向/风力:西南风 1级;湿度:62%;空气质量:暂无;紫外线强度:弱 34 </string> 35 <string> 36 太阳镜指数:必要。建议佩戴透射比为1级的浅色太阳镜。 37 穿衣指数:炎热。建议穿短衫、短裤等清凉夏季服装。 38 旅游指数:适宜。微风,虽天气稍热,但不会影响心情。 39 运动指数:较适宜。户外运动请注意防晒。 40 洗车指数:不宜。有雨,雨水和泥水会弄脏爱车。 41 化妆指数:防脱水。请选用防脱水化妆品。 42 感冒指数:少发。感冒机率较低,避免长期处于空调屋中。 43 空气污染指数:暂无。 44 紫外线指数:弱。辐射较弱,涂擦SPF12-15、PA+护肤品。 45 舒适度指数:较不舒适。多云,有些热。 46 </string> 47 <string> 48 25℃/29℃ 49 </string> 50 <string> 51 9月20日 中雨转中到大雨 52 </string> 53 <string> 54 无持续风向微风 55 </string> 56 <string> 57 8.gif 58 </string> 59 <string> 60 22.gif 61 </string> 62 <string> 63 24℃/29℃ 64 </string> 65 <string> 66 9月21日 中到大雨转雷阵雨 67 </string> 68 <string> 69 无持续风向微风 70 </string> 71 <string> 72 22.gif 73 </string> 74 <string> 75 4.gif 76 </string> 77 <string> 78 广州是广东省的省会,是中国南方最大的海滨城市,广州位于东经113。17`,北纬23。8`,地处中国大陆南部,广东省南部,珠江三角洲北缘。广州临南海,邻近香港特别行政区,是中国通往世界的南大门,广州属丘陵地带。中国的第三大河----珠江从广州市中心穿流而过。广州是一座历史文化名城。相传在远古时候,曾有五位仙人,身穿五色彩服、骑着嘴衔稻穗的五色仙羊降临此地,把稻穗赠给百姓,祝愿这里永无饥荒。从此,广州便有“羊城”、“穗城”的美称,“五羊”也成为广州的象征。广州既是中国也是世界名城,又是一座古城,因历史上有五羊仙子降临献稻穗的故事,广州又称为“羊城”和“穗城”,简称“穗”;广州一年四季如春、繁花似锦,除夕迎春花市闻名海内外,故又有“花城”的美誉。广州地处低纬,属南亚热带季风气候区。地表接受太阳辐射量较多,同时受季风的影响,夏季海洋暖气流形成高温、高湿、多雨的气候;冬季北方大陆冷风形成低温、干燥、少雨的气候。年平均气温为21.4-21.9度,年降雨量平均为1623.6-1899.8mm,北部多于南部。1982年,广州被国务院选定为全国首批历史文化名城之一,是我国重点旅游城市。1999年1月,广州被评为优秀旅游城市。景观:白云山、莲花山、南海神庙、佛山祖庙、广州动物园等。 79 </string> 80 </ArrayOfString>
JSON 数据格式:
请求网址:https://alpha-api.app.net/stream/0/posts/stream/global
1 { 2 "data": [ 3 { 4 "canonical_url": "https://alpha.app.net/hasskod2013/post/64791677", 5 "created_at": "2015-09-19T11:23:30Z", 6 "entities": { 7 "hashtags": [ 8 ], 9 "links": [ 10 { 11 "len": 21, 12 "pos": 163, 13 "text": "http://bit.ly/1Ynt5DC", 14 "url": "http://bit.ly/1Ynt5DC" 15 } 16 ], 17 "mentions": [ 18 ] 19 }, 20 "html": "<span itemscope=\"https://app.net/schemas/Post\">Oman says ambassador‘s home hit in Yemen: Foreign ministry condemns incident in Sanaa as Arab coalition bombards Houthi-held sites as part of move to retake city. <a href=\"http://bit.ly/1Ynt5DC\">http://bit.ly/1Ynt5DC</a></span>", 21 "id": "64791677", 22 "machine_only": false, 23 "num_replies": 0, 24 "num_reposts": 0, 25 "num_stars": 0, 26 "pagination_id": "64791677", 27 "source": { 28 "client_id": "8dWzbxxwZeTTAH3v7Yy9TbJ82W6mexqH", 29 "link": "http://twitterfeed.com", 30 "name": "twitterfeed" 31 }, 32 "text": "Oman says ambassador‘s home hit in Yemen: Foreign ministry condemns incident in Sanaa as Arab coalition bombards Houthi-held sites as part of move to retake city. http://bit.ly/1Ynt5DC", 33 "thread_id": "64791677", 34 "user": { 35 "avatar_image": { 36 "height": 80, 37 "is_default": false, 38 "url": "https://d2rfichhc2fb9n.cloudfront.net/image/5/8crtOD1QaZ4b0uA6GnTQQMVTgJJ7InMiOiJzMyIsImIiOiJhZG4tdXNlci1hc3NldHMiLCJrIjoiYXNzZXRzL3VzZXIvMjMvZmIvNTAvMjNmYjUwMDAwMDAwMDAwMC5wbmciLCJvIjoiIn0", 39 "width": 80 40 }, 41 "canonical_url": "https://alpha.app.net/hasskod2013", 42 "counts": { 43 "followers": 16, 44 "following": 33, 45 "posts": 11722, 46 "stars": 0 47 }, 48 "cover_image": { 49 "height": 260, 50 "is_default": true, 51 "url": "https://d2rfichhc2fb9n.cloudfront.net/image/5/kZ-JRmTbmd3WVPswTJ8Nwxzkf917InMiOiJzMyIsImIiOiJ0YXBwLWFzc2V0cyIsImsiOiJpL1UvaS9ZL1VpWW5xRFNvTUtyTEhLNXA0OHN2NkxmTmRVMC5qcGciLCJvIjoiIn0", 52 "width": 960 53 }, 54 "created_at": "2013-08-28T11:18:40Z", 55 "id": "155975", 56 "locale": "ar_AA", 57 "name": "hasskod", 58 "timezone": "Asia/Baghdad", 59 "type": "feed", 60 "username": "hasskod2013" 61 } 62 }, 63 //同样格式的19个数组元素内容,这里省略... 64 ], 65 "meta": { 66 "code": 200, 67 "max_id": "64791677", 68 "min_id": "64791658", 69 "more": true 70 } 71 }
ViewController.h
1 #import <UIKit/UIKit.h> 2 3 @interface ViewController : UITableViewController 4 @property (copy, nonatomic) NSArray *arrSampleName; 5 6 - (instancetype)initWithSampleNameArray:(NSArray *)arrSampleName; 7 8 @end
ViewController.m
1 #import "ViewController.h" 2 #import "XMLRequestViewController.h" 3 #import "JSONRequestViewController.h" 4 5 @interface ViewController () 6 - (void)layoutUI; 7 @end 8 9 @implementation ViewController 10 - (void)viewDidLoad { 11 [super viewDidLoad]; 12 13 [self layoutUI]; 14 } 15 16 - (void)didReceiveMemoryWarning { 17 [super didReceiveMemoryWarning]; 18 // Dispose of any resources that can be recreated. 19 } 20 21 - (instancetype)initWithSampleNameArray:(NSArray *)arrSampleName { 22 if (self = [super initWithStyle:UITableViewStyleGrouped]) { 23 self.navigationItem.title = @"使用 AFNetworking 进行数据请求"; 24 self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"返回" style:UIBarButtonItemStylePlain target:nil action:nil]; 25 26 _arrSampleName = arrSampleName; 27 } 28 return self; 29 } 30 31 - (void)layoutUI { 32 33 } 34 35 #pragma mark - UITableViewController相关方法重写 36 - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { 37 return 0.1; 38 } 39 40 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 41 return 1; 42 } 43 44 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 45 return [_arrSampleName count]; 46 } 47 48 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 49 static NSString *cellIdentifier = @"cell"; 50 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 51 if (!cell) { 52 cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; 53 } 54 cell.textLabel.text = _arrSampleName[indexPath.row]; 55 return cell; 56 } 57 58 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 59 switch (indexPath.row) { 60 case 0: { 61 XMLRequestViewController *XMLRequestVC = [XMLRequestViewController new]; 62 [self.navigationController pushViewController:XMLRequestVC animated:YES]; 63 break; 64 } 65 case 1: { 66 JSONRequestViewController *JSONRequestVC = [JSONRequestViewController new]; 67 [self.navigationController pushViewController:JSONRequestVC animated:YES]; 68 break; 69 70 /* 71 类似堆栈的先进后出的原理: 72 返回到(上一级)、(任意级)、(根级)导航 73 [self.navigationController popViewControllerAnimated:YES]; 74 [self.navigationController popToViewController:thirdSampleVC animated:YES]; 75 [self.navigationController popToRootViewControllerAnimated:YES]; 76 */ 77 } 78 default: 79 break; 80 } 81 } 82 83 @end
PrefixHeader.pch
1 #define kXMLRequestURLStr @"http://www.webxml.com.cn/WebServices/WeatherWebService.asmx/getWeatherbyCityName?theCityName=59287" 2 #define kJSONRequestURLStr @"https://alpha-api.app.net/stream/0/posts/stream/global" 3 4 #define kTitleOfXMLRequest @"XML 数据请求" 5 #define kTitleOfJSONRequest @"JSON 数据请求" 6 7 #define kAvatarImageStr @"avatarImageStr" 8 #define kName @"name" 9 #define kText @"text" 10 #define kLink @"link" 11 #define kCreatedAt @"createdAt" 12 13 #define kApplication [UIApplication sharedApplication]
UIButton+BeautifulButton.h
1 #import <UIKit/UIKit.h> 2 3 @interface UIButton (BeautifulButton) 4 /** 5 * 根据按钮文字颜色,返回对应文字颜色的圆角按钮 6 * 7 * @param tintColor 按钮文字颜色;nil 的话就为深灰色 8 */ 9 - (void)beautifulButton:(UIColor *)tintColor; 10 11 @end
UIButton+BeautifulButton.m
1 #import "UIButton+BeautifulButton.h" 2 3 @implementation UIButton (BeautifulButton) 4 5 - (void)beautifulButton:(UIColor *)tintColor { 6 self.tintColor = tintColor ?: [UIColor darkGrayColor]; 7 self.layer.masksToBounds = YES; 8 self.layer.cornerRadius = 10.0; 9 self.layer.borderColor = [UIColor grayColor].CGColor; 10 self.layer.borderWidth = 1.0; 11 } 12 13 @end
NSString+OpenURL.h
1 #import <UIKit/UIKit.h> 2 3 @interface NSString (OpenURL) 4 /** 5 * 打开浏览器 6 */ 7 - (void)openByBrowser; 8 9 /** 10 * 打开邮件 11 */ 12 - (void)openByEmail; 13 14 /** 15 * 拨打电话 16 */ 17 - (void)openByTelephone; 18 19 /** 20 * 打开短信(Short Messaging Service) 21 */ 22 - (void)openBySMS; 23 24 @end
NSString+OpenURL.m
1 #import "NSString+OpenURL.h" 2 3 @implementation NSString (OpenURL) 4 5 + (void)open:(NSString *)openURLStr { 6 [[UIApplication sharedApplication] openURL:[NSURL URLWithString:openURLStr]]; 7 } 8 9 - (void)openByBrowser { 10 [NSString open:self]; 11 } 12 13 - (void)openByEmail { 14 [NSString open:[NSString stringWithFormat:@"mailto://%@", self]]; 15 } 16 17 - (void)openByTelephone { 18 [NSString open:[NSString stringWithFormat:@"tel://%@", self]]; 19 } 20 21 - (void)openBySMS { 22 [NSString open:[NSString stringWithFormat:@"sms://%@", self]]; 23 } 24 25 @end
KMTableViewCell.h
1 #import <UIKit/UIKit.h> 2 3 @interface KMTableViewCell : UITableViewCell 4 @property (strong, nonatomic) IBOutlet UIImageView *imgVAvatarImage; 5 @property (strong, nonatomic) IBOutlet UILabel *lblName; 6 @property (strong, nonatomic) IBOutlet UILabel *lblCreatedAt; 7 @property (strong, nonatomic) IBOutlet UIImageView *imgVLink; 8 9 @property (strong, nonatomic) UILabel *lblText; 10 @property (copy, nonatomic) NSString *avatarImageStr; 11 @property (copy, nonatomic) NSString *name; 12 @property (copy, nonatomic) NSString *text; 13 @property (copy, nonatomic) NSString *createdAt; 14 @property (assign, nonatomic, getter=isHaveLink) BOOL haveLink; 15 16 @end
KMTableViewCell.m
1 #import "KMTableViewCell.h" 2 //#import "UIImageView+AFNetworking.h" 3 #import "UIImageView+WebCache.h" 4 5 static UIImage *placeholderImage; 6 static CGFloat widthOfLabel; 7 @implementation KMTableViewCell 8 9 - (void)awakeFromNib { 10 // Initialization code 11 static dispatch_once_t onceToken; 12 dispatch_once(&onceToken, ^{ 13 placeholderImage = [UIImage imageNamed:@"JSON"]; 14 widthOfLabel = [[UIScreen mainScreen] bounds].size.width - 100.0; 15 }); 16 17 _imgVAvatarImage.layer.masksToBounds = YES; 18 _imgVAvatarImage.layer.cornerRadius = 10.0; 19 20 //由于 xib 中对标签自适应宽度找不到合适的方式来控制,所以这里用代码编写;这里屏幕复用的 Cell 有几个,就会执行几次 awakeFromNib 方法 21 _lblText = [[UILabel alloc] initWithFrame:CGRectMake(90.0, 23.0, widthOfLabel, 42.0)]; 22 _lblText.numberOfLines = 2; 23 _lblText.font = [UIFont systemFontOfSize:12.0]; 24 [self addSubview:_lblText]; 25 } 26 27 - (void)setSelected:(BOOL)selected animated:(BOOL)animated { 28 [super setSelected:selected animated:animated]; 29 30 // Configure the view for the selected state 31 } 32 33 - (void)setAvatarImageStr:(NSString *)avatarImageStr { 34 if (![_avatarImageStr isEqualToString:avatarImageStr]) { 35 _avatarImageStr = [avatarImageStr copy]; 36 NSURL *avatarImageURL = [NSURL URLWithString:_avatarImageStr]; 37 //NSData *avatarImageData = [NSData dataWithContentsOfURL:avatarImageURL]; 38 //_imgVAvatarImage.image = [UIImage imageWithData:avatarImageData]; 39 40 //图片缓存;性能优化的第一步 41 //方法一:AFNetworking 框架:UIImageView+AFNetworking 42 // [_imgVAvatarImage setImageWithURL:avatarImageURL 43 // placeholderImage:placeholderImage]; 44 45 //方法二:SDWebImage 框架:UIImageView+WebCache 46 [_imgVAvatarImage sd_setImageWithURL:avatarImageURL 47 placeholderImage:placeholderImage]; 48 } 49 } 50 51 - (void)setName:(NSString *)name { 52 _name = [name copy]; 53 _lblName.text = _name; 54 } 55 56 - (void)setText:(NSString *)text { 57 _text = [text copy]; 58 _lblText.text = _text; 59 } 60 61 - (void)setCreatedAt:(NSString *)createdAt { 62 _createdAt = [createdAt copy]; 63 _lblCreatedAt.text = _createdAt; 64 } 65 66 - (void)setHaveLink:(BOOL)haveLink { 67 _haveLink = haveLink; 68 _imgVLink.hidden = !_haveLink; 69 } 70 71 @end
KMTableViewCell.xib
1 <?xml version="1.0" encoding="UTF-8" standalone="no"?> 2 <document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="7706" systemVersion="14E46" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES"> 3 <dependencies> 4 <deployment identifier="iOS"/> 5 <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="7703"/> 6 </dependencies> 7 <objects> 8 <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File‘s Owner"/> 9 <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/> 10 <tableViewCell contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" reuseIdentifier="cellIdentifier" rowHeight="101" id="KGk-i7-Jjw" customClass="KMTableViewCell"> 11 <rect key="frame" x="0.0" y="0.0" width="375" height="101"/> 12 <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> 13 <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="KGk-i7-Jjw" id="H2p-sc-9uM"> 14 <rect key="frame" x="0.0" y="0.0" width="320" height="43"/> 15 <autoresizingMask key="autoresizingMask"/> 16 <subviews> 17 <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="3Br-R7-YsD"> 18 <rect key="frame" x="0.0" y="5" width="80" height="80"/> 19 </imageView> 20 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="name" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="kPR-pa-8uG"> 21 <rect key="frame" x="90" y="2" width="230" height="21"/> 22 <fontDescription key="fontDescription" type="boldSystem" pointSize="14"/> 23 <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/> 24 <nil key="highlightedColor"/> 25 </label> 26 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="created_at" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="iAH-dO-aus"> 27 <rect key="frame" x="90" y="64" width="130" height="21"/> 28 <fontDescription key="fontDescription" type="system" pointSize="12"/> 29 <color key="textColor" red="0.40000000596046448" green="0.40000000596046448" blue="0.40000000596046448" alpha="1" colorSpace="calibratedRGB"/> 30 <nil key="highlightedColor"/> 31 </label> 32 <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" image="Action_ReadOriginal" translatesAutoresizingMaskIntoConstraints="NO" id="By5-cw-IJd"> 33 <rect key="frame" x="223" y="60" width="30" height="30"/> 34 </imageView> 35 </subviews> 36 </tableViewCellContentView> 37 <connections> 38 <outlet property="imgVAvatarImage" destination="3Br-R7-YsD" id="KaV-vS-y5p"/> 39 <outlet property="imgVLink" destination="By5-cw-IJd" id="wrr-zz-EqH"/> 40 <outlet property="lblCreatedAt" destination="iAH-dO-aus" id="BNF-es-fb1"/> 41 <outlet property="lblName" destination="kPR-pa-8uG" id="BH7-oj-3Kx"/> 42 </connections> 43 <point key="canvasLocation" x="254.5" y="377.5"/> 44 </tableViewCell> 45 </objects> 46 <resources> 47 <image name="Action_ReadOriginal" width="60" height="60"/> 48 </resources> 49 </document>
XMLRequestViewController.h
1 #import <UIKit/UIKit.h> 2 3 @interface XMLRequestViewController : UIViewController <NSXMLParserDelegate> 4 @property (strong, nonatomic) UITextView *txtVResult; 5 6 @property (strong, nonatomic) IBOutlet UIButton *btnSendRequest; 7 8 @end
XMLRequestViewController.m
1 #import "XMLRequestViewController.h" 2 #import "AFNetworking.h" 3 #import "AFNetworkActivityIndicatorManager.h" 4 #import "UIButton+BeautifulButton.h" 5 #import "XMLDictionary.h" 6 7 @interface XMLRequestViewController () 8 - (void)layoutUI; 9 - (void)convertXMLParserToDictionary:(NSXMLParser *)parser; 10 @end 11 12 @implementation XMLRequestViewController 13 14 - (void)viewDidLoad { 15 [super viewDidLoad]; 16 17 [self layoutUI]; 18 } 19 20 - (void)didReceiveMemoryWarning { 21 [super didReceiveMemoryWarning]; 22 // Dispose of any resources that can be recreated. 23 } 24 25 - (void)layoutUI { 26 self.navigationItem.title = kTitleOfXMLRequest; 27 28 [_btnSendRequest beautifulButton:nil]; 29 30 _txtVResult = [UITextView new]; 31 _txtVResult.editable = NO; 32 CGRect rect = [[UIScreen mainScreen] bounds]; 33 _txtVResult.frame = CGRectMake(5.0, 64.0, rect.size.width - 10.0, rect.size.height - 164.0); 34 _txtVResult.font = [UIFont systemFontOfSize:15.0]; 35 _txtVResult.text = @"点击「发送请求」按钮获取天气信息"; 36 [self.view addSubview:_txtVResult]; 37 38 //启动网络活动指示器;会根据网络交互情况,实时显示或隐藏网络活动指示器;他通过「通知与消息机制」来实现 [UIApplication sharedApplication].networkActivityIndicatorVisible 的控制 39 [AFNetworkActivityIndicatorManager sharedManager].enabled = YES; 40 } 41 42 - (void)convertXMLParserToDictionary:(NSXMLParser *)parser { 43 //dictionaryWithXMLParser: 是第三方框架 XMLDictionary 的方法 44 NSDictionary *dic = [NSDictionary dictionaryWithXMLParser:parser]; 45 NSMutableString *mStrWeatherInfo = [[NSMutableString alloc] initWithString:@"广州近三天天气情况:\n"]; 46 NSArray *arrWeatherInfo = [dic objectForKey:@"string"]; 47 if (arrWeatherInfo != nil && arrWeatherInfo.count > 22) { 48 NSMutableArray *mArrRange = [[NSMutableArray alloc] init]; 49 50 NSUInteger loc = mStrWeatherInfo.length; 51 [mStrWeatherInfo appendFormat:@"\n %@", arrWeatherInfo[6]]; 52 NSUInteger len = mStrWeatherInfo.length - loc; 53 NSValue *valObj = [NSValue valueWithRange:NSMakeRange(loc, len)]; 54 [mArrRange addObject:valObj]; 55 [mStrWeatherInfo appendFormat:@"\n %@", arrWeatherInfo[5]]; 56 [mStrWeatherInfo appendFormat:@"\n %@", arrWeatherInfo[7]]; 57 [mStrWeatherInfo appendFormat:@"\n %@", arrWeatherInfo[10]]; 58 59 loc = mStrWeatherInfo.length; 60 [mStrWeatherInfo appendFormat:@"\n\n %@", arrWeatherInfo[13]]; 61 len = mStrWeatherInfo.length - loc; 62 valObj = [NSValue valueWithRange:NSMakeRange(loc, len)]; 63 [mArrRange addObject:valObj]; 64 [mStrWeatherInfo appendFormat:@"\n %@", arrWeatherInfo[12]]; 65 [mStrWeatherInfo appendFormat:@"\n %@", arrWeatherInfo[14]]; 66 67 loc = mStrWeatherInfo.length; 68 [mStrWeatherInfo appendFormat:@"\n\n %@", arrWeatherInfo[18]]; 69 len = mStrWeatherInfo.length - loc; 70 valObj = [NSValue valueWithRange:NSMakeRange(loc, len)]; 71 [mArrRange addObject:valObj]; 72 [mStrWeatherInfo appendFormat:@"\n %@", arrWeatherInfo[17]]; 73 [mStrWeatherInfo appendFormat:@"\n %@", arrWeatherInfo[19]]; 74 75 [mStrWeatherInfo appendFormat:@"\n\n %@", arrWeatherInfo[22]]; 76 77 //数据的前10个字符以16.0像素加粗显示;这里使用 UITextView 的 attributedText,而他的 text 无法实现这种需求 78 NSMutableAttributedString *mAttrStr = [[NSMutableAttributedString alloc] initWithString:mStrWeatherInfo]; 79 [mAttrStr addAttribute:NSFontAttributeName 80 value:[UIFont boldSystemFontOfSize:16.0] 81 range:NSMakeRange(0, 10)]; 82 83 //数据的日期部分以紫色显示 84 for (NSValue *valObj in mArrRange) { 85 NSRange currentRange; 86 [valObj getValue:¤tRange]; 87 [mAttrStr addAttribute:NSForegroundColorAttributeName 88 value:[UIColor purpleColor] 89 range:currentRange]; 90 } 91 92 //数据的前10个字符之后的内容全部以15.0像素显示 93 [mAttrStr addAttribute:NSFontAttributeName 94 value:[UIFont systemFontOfSize:15.0] 95 range:NSMakeRange(10, mStrWeatherInfo.length - 10)]; 96 97 _txtVResult.attributedText = mAttrStr; 98 } else { 99 _txtVResult.text = @"请求数据无效"; 100 } 101 102 } 103 104 - (IBAction)sendRequest:(id)sender { 105 NSURL *requestURL = [NSURL URLWithString:kXMLRequestURLStr]; 106 NSURLRequest *request = [NSURLRequest requestWithURL:requestURL]; 107 AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:request]; 108 op.responseSerializer = [AFXMLParserResponseSerializer serializer]; 109 [op setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 110 NSLog(@"JSON: %@", responseObject); 111 NSXMLParser *parser = (NSXMLParser *)responseObject; 112 //这里使用了第三方框架 XMLDictionary,他本身继承并实现 NSXMLParserDelegate 委托代理协议,对数据进行遍历处理 113 [self convertXMLParserToDictionary:parser]; 114 115 //parser.delegate = self; 116 //parser.shouldProcessNamespaces = YES; 117 //[parser parse]; 118 } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 119 NSLog(@"Error: %@", error); 120 }]; 121 //start 是 AFNetworking 的自定义方法,他在自定义的线程中去执行操作;不是 NSOperation 对象实例的 start 方法,所以可以不用使用把操作添加到操作主队列的方法:[[NSOperationQueue mainQueue] addOperation:op] 122 [op start]; 123 } 124 125 126 #pragma mark - 127 #pragma mark NSXMLParserDelegate 128 /* 开始解析 XML 文件,在开始解析 XML 节点前,通过该方法可以做一些初始化工作 */ 129 - (void)parserDidStartDocument:(NSXMLParser *)parser { 130 NSLog(@"开始解析 XML 文件"); 131 } 132 133 /* 当解析器对象遇到 XML 的开始标记时,调用这个方法开始解析该节点 */ 134 - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName 135 attributes:(NSDictionary *)attributeDict { 136 NSLog(@"发现节点:%@", elementName); 137 } 138 139 /* 当解析器找到开始标记和结束标记之间的字符时,调用这个方法解析当前节点的所有字符 */ 140 - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { 141 NSLog(@"正在解析节点内容:%@", string); 142 } 143 144 /* 当解析器对象遇到 XML 的结束标记时,调用这个方法完成解析该节点 */ 145 - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { 146 NSLog(@"解析节点结束:%@", elementName); 147 } 148 149 /* 解析 XML 出错的处理方法 */ 150 - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError { 151 NSLog(@"解析 XML 出错:%@", parseError); 152 } 153 154 /* 解析 XML 文件结束 */ 155 - (void)parserDidEndDocument:(NSXMLParser *)parser { 156 NSLog(@"解析 XML 文件结束"); 157 } 158 159 @end
XMLRequestViewController.xib
1 <?xml version="1.0" encoding="UTF-8" standalone="no"?> 2 <document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="7706" systemVersion="14E46" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES"> 3 <dependencies> 4 <deployment identifier="iOS"/> 5 <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="7703"/> 6 </dependencies> 7 <objects> 8 <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File‘s Owner" customClass="XMLRequestViewController"> 9 <connections> 10 <outlet property="btnSendRequest" destination="zCQ-LM-grx" id="tgt-2z-WaB"/> 11 <outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/> 12 </connections> 13 </placeholder> 14 <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/> 15 <view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="i5M-Pr-FkT"> 16 <rect key="frame" x="0.0" y="0.0" width="600" height="600"/> 17 <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> 18 <subviews> 19 <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="zCQ-LM-grx"> 20 <rect key="frame" x="250" y="520" width="100" height="40"/> 21 <constraints> 22 <constraint firstAttribute="width" constant="100" id="V3R-30-5vV"/> 23 <constraint firstAttribute="height" constant="40" id="yct-84-Mk4"/> 24 </constraints> 25 <state key="normal" title="发送请求"> 26 <color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/> 27 </state> 28 <connections> 29 <action selector="sendRequest:" destination="-1" eventType="touchUpInside" id="8zG-Dl-erk"/> 30 </connections> 31 </button> 32 </subviews> 33 <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/> 34 <constraints> 35 <constraint firstAttribute="bottom" secondItem="zCQ-LM-grx" secondAttribute="bottom" constant="40" id="DBx-zw-hdG"/> 36 <constraint firstAttribute="centerX" secondItem="zCQ-LM-grx" secondAttribute="centerX" id="F2b-L7-BR9"/> 37 </constraints> 38 </view> 39 </objects> 40 </document>
JSONRequestViewController.h
1 #import <UIKit/UIKit.h> 2 3 @interface JSONRequestViewController : UIViewController <UITableViewDataSource, UITableViewDelegate, UIWebViewDelegate> 4 @property (strong, nonatomic) NSMutableArray *mArrCell; 5 @property (strong, nonatomic) UITableView *tableView; 6 @property (strong, nonatomic) UILabel *lblEmptyDataMsg; 7 @property (strong, nonatomic) UIWebView *webView; 8 9 @property (strong, nonatomic) IBOutlet UIButton *btnSendRequest; 10 11 @end
JSONRequestViewController.m
1 #import "JSONRequestViewController.h" 2 #import "AFNetworking.h" 3 #import "AFNetworkActivityIndicatorManager.h" 4 #import "UIButton+BeautifulButton.h" 5 #import "KMTableViewCell.h" 6 #import "NSString+OpenURL.h" 7 8 static NSString *cellIdentifier = @"cellIdentifier"; 9 @interface JSONRequestViewController () 10 - (void)layoutUI; 11 - (NSString *)displayTimeFromCreatedAt:(NSString *)createdAt; 12 - (void)loadData:(NSArray *)arrData; 13 @end 14 15 @implementation JSONRequestViewController 16 17 - (void)viewDidLoad { 18 [super viewDidLoad]; 19 20 [self layoutUI]; 21 } 22 23 - (void)didReceiveMemoryWarning { 24 [super didReceiveMemoryWarning]; 25 // Dispose of any resources that can be recreated. 26 } 27 28 - (void)layoutUI { 29 self.navigationItem.title = kTitleOfJSONRequest; 30 31 [_btnSendRequest beautifulButton:nil]; 32 33 _mArrCell = [[NSMutableArray alloc] initWithCapacity:0]; 34 35 CGRect rect = [[UIScreen mainScreen] bounds]; 36 CGRect frame = CGRectMake(5.0, 64.0, rect.size.width - 10.0, rect.size.height - 164.0); 37 _tableView =[[UITableView alloc] initWithFrame:frame style:UITableViewStylePlain]; 38 _tableView.separatorInset = UIEdgeInsetsZero; //设置单元格(上左下右)内边距 39 _tableView.layoutMargins = UIEdgeInsetsZero; //设置单元格(上左下右)外边距 40 _tableView.dataSource = self; 41 _tableView.delegate = self; 42 [self.view addSubview:_tableView]; 43 44 //注册可复用的单元格 45 UINib *nib = [UINib nibWithNibName:@"KMTableViewCell" bundle:nil]; 46 [_tableView registerNib:nib forCellReuseIdentifier:cellIdentifier]; 47 48 //空数据时,显示的提示内容 49 _lblEmptyDataMsg = [[UILabel alloc] initWithFrame:CGRectMake(0.0, 0.0, 300.0, 50.0)]; 50 CGPoint newPoint = _tableView.center; 51 newPoint.y -= 45.0; 52 _lblEmptyDataMsg.center = newPoint; 53 _lblEmptyDataMsg.text = @"点击「发送请求」按钮获取全球新闻信息"; 54 _lblEmptyDataMsg.textColor = [UIColor grayColor]; 55 _lblEmptyDataMsg.textAlignment = NSTextAlignmentCenter; 56 _lblEmptyDataMsg.font = [UIFont systemFontOfSize:16.0]; 57 [_tableView addSubview:_lblEmptyDataMsg]; 58 59 //点击单元格时,显示的新闻信息详细内容 60 frame = CGRectMake(10.0, CGRectGetMidY(rect) - 200.0, rect.size.width - 20.0, 400.0); 61 _webView = [[UIWebView alloc] initWithFrame:frame]; 62 _webView.layer.borderColor = [UIColor lightGrayColor].CGColor; 63 _webView.layer.borderWidth = 1.0; 64 _webView.delegate = self; 65 _webView.hidden = YES; 66 [self.view addSubview:_webView]; 67 68 [AFNetworkActivityIndicatorManager sharedManager].enabled = YES; 69 } 70 71 - (NSString *)displayTimeFromCreatedAt:(NSString *)createdAt { 72 NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; 73 [dateFormat setDateFormat:@"yyyy-MM-dd‘T‘HH:mm:ss‘Z‘"]; //「2015-09-15T13:23:28Z」 74 NSDate *date = [dateFormat dateFromString:createdAt]; 75 76 NSTimeZone *zone = [NSTimeZone systemTimeZone]; 77 NSInteger interval = [zone secondsFromGMTForDate:date]; //跟 GMT 时间相差8小时 78 date = [date dateByAddingTimeInterval:interval]; 79 [dateFormat setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; //转化为「2015-09-15 21:23:28」 80 NSString *displayTime = [dateFormat stringFromDate:date]; 81 return displayTime; 82 } 83 84 - (void)loadData:(NSArray *)arrData { 85 _mArrCell = [NSMutableArray new]; 86 [arrData enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 87 NSMutableDictionary *mDicCell = [NSMutableDictionary new]; 88 NSDictionary *dicRoot = (NSDictionary *)obj; 89 NSArray *arrLink = [dicRoot valueForKeyPath:@"entities.links"]; 90 [mDicCell setValue:[NSString stringWithFormat:@"%@?w=80&h=80", 91 [dicRoot valueForKeyPath:@"user.avatar_image.url"]] 92 forKey:kAvatarImageStr]; 93 [mDicCell setValue:[dicRoot valueForKeyPath:@"user.name"] forKey:kName]; 94 [mDicCell setValue:[dicRoot valueForKey:@"text"] forKey:kText]; 95 [mDicCell setValue:(arrLink.count > 0 ? [arrLink[0] valueForKey:@"url"] : @"") 96 forKey:kLink]; 97 [mDicCell setValue:[self displayTimeFromCreatedAt:[dicRoot valueForKey:@"created_at"]] 98 forKey:kCreatedAt]; 99 [_mArrCell addObject:mDicCell]; 100 }]; 101 [self.tableView reloadData]; 102 } 103 104 - (IBAction)sendRequest:(id)sender { 105 _lblEmptyDataMsg.text = @"加载中..."; 106 _webView.hidden = YES; 107 108 //方法一:AFHTTPRequestOperation 109 // NSURL *requestURL = [NSURL URLWithString:kJSONRequestURLStr]; 110 // NSURLRequest *request = [NSURLRequest requestWithURL:requestURL]; 111 // AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:request]; 112 // op.responseSerializer = [AFJSONResponseSerializer serializer]; 113 // [op setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 114 // NSDictionary *dic = (NSDictionary *)responseObject; 115 // [self loadData:(NSArray *)dic[@"data"]]; 116 // } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 117 // NSLog(@"Error: %@", error); 118 // }]; 119 // //start 是 AFNetworking 的自定义方法,他在自定义的线程中去执行操作;不是 NSOperation 对象实例的 start 方法,所以可以不用使用把操作添加到操作主队列的方法:[[NSOperationQueue mainQueue] addOperation:op] 120 // [op start]; 121 122 //方法二:AFHTTPRequestOperationManager 123 AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 124 [manager GET:kJSONRequestURLStr parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { 125 NSDictionary *dic = (NSDictionary *)responseObject; 126 [self loadData:(NSArray *)dic[@"data"]]; 127 } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 128 NSLog(@"Error: %@", error); 129 }]; 130 } 131 132 - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 133 _webView.hidden = YES; 134 } 135 136 #pragma mark - TableView 137 - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { 138 return @"全球新闻信息列表"; 139 } 140 141 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 142 return 1; 143 } 144 145 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 146 NSUInteger count = _mArrCell.count; 147 _lblEmptyDataMsg.hidden = count > 0; 148 149 return count; 150 } 151 152 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 153 KMTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 154 if (!cell) { 155 cell = [[KMTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 156 reuseIdentifier:cellIdentifier]; 157 } 158 159 NSMutableDictionary *mDicCell = _mArrCell[indexPath.row]; 160 cell.avatarImageStr = mDicCell[kAvatarImageStr]; 161 cell.name = mDicCell[kName]; 162 cell.text = mDicCell[kText]; 163 cell.createdAt = mDicCell[kCreatedAt]; 164 cell.haveLink = [mDicCell[kLink] length] > 0; //可以通过 isHaveLink 或 haveLink 获取值 165 return cell; 166 } 167 168 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 169 return 90.0; 170 } 171 172 - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { 173 //设置单元格(上左下右)内边距;viewDidLoad 时 _tableView.separatorInset = UIEdgeInsetsZero; 174 cell.separatorInset = UIEdgeInsetsZero; 175 //设置单元格(上左下右)外边距;viewDidLoad 时 _tableView.layoutMargins = UIEdgeInsetsZero; 176 cell.layoutMargins = UIEdgeInsetsZero; 177 } 178 179 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 180 NSMutableDictionary *mDicCell = _mArrCell[indexPath.row]; 181 NSString *link = mDicCell[kLink]; 182 if (link.length > 0) { 183 //使用浏览器打开网址 184 //[link openByBrowser]; 185 186 //使用 WebView 打开网址;由于这里很多网址是外国的,存在有的访问不了、有的访问慢导致加载超时的情况 187 NSURLRequest *request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:link]]; 188 [_webView loadRequest:request]; 189 _webView.hidden = NO; 190 } 191 } 192 193 #pragma mark - WebView 194 - (void)webViewDidStartLoad:(UIWebView *)webView { 195 kApplication.networkActivityIndicatorVisible = YES; 196 } 197 198 - (void)webViewDidFinishLoad:(UIWebView *)webView { 199 kApplication.networkActivityIndicatorVisible = NO; 200 } 201 202 - (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error { 203 NSLog(@"Error: %@", error); 204 webView.hidden = YES; 205 kApplication.networkActivityIndicatorVisible = NO; 206 UIAlertView *alertVCustom = [[UIAlertView alloc] initWithTitle:@"提示信息" 207 message:@"网络连接错误" 208 delegate:nil 209 cancelButtonTitle:@"确定" 210 otherButtonTitles:nil, nil]; 211 [alertVCustom show]; 212 } 213 214 @end
JSONRequestViewController.xib
1 <?xml version="1.0" encoding="UTF-8" standalone="no"?> 2 <document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="7706" systemVersion="14E46" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES"> 3 <dependencies> 4 <deployment identifier="iOS"/> 5 <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="7703"/> 6 </dependencies> 7 <objects> 8 <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File‘s Owner" customClass="JSONRequestViewController"> 9 <connections> 10 <outlet property="btnSendRequest" destination="zCQ-LM-grx" id="tgt-2z-WaB"/> 11 <outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/> 12 </connections> 13 </placeholder> 14 <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/> 15 <view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="i5M-Pr-FkT"> 16 <rect key="frame" x="0.0" y="0.0" width="600" height="600"/> 17 <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> 18 <subviews> 19 <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="zCQ-LM-grx"> 20 <rect key="frame" x="250" y="520" width="100" height="40"/> 21 <constraints> 22 <constraint firstAttribute="width" constant="100" id="V3R-30-5vV"/> 23 <constraint firstAttribute="height" constant="40" id="yct-84-Mk4"/> 24 </constraints> 25 <state key="normal" title="发送请求"> 26 <color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/> 27 </state> 28 <connections> 29 <action selector="sendRequest:" destination="-1" eventType="touchUpInside" id="8zG-Dl-erk"/> 30 </connections> 31 </button> 32 </subviews> 33 <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/> 34 <constraints> 35 <constraint firstAttribute="bottom" secondItem="zCQ-LM-grx" secondAttribute="bottom" constant="40" id="DBx-zw-hdG"/> 36 <constraint firstAttribute="centerX" secondItem="zCQ-LM-grx" secondAttribute="centerX" id="F2b-L7-BR9"/> 37 </constraints> 38 </view> 39 </objects> 40 </document>
AppDelegate.h
1 #import <UIKit/UIKit.h> 2 3 @interface AppDelegate : UIResponder <UIApplicationDelegate> 4 5 @property (strong, nonatomic) UIWindow *window; 6 @property (strong, nonatomic) UINavigationController *navigationController; 7 8 @end
AppDelegate.m
1 #import "AppDelegate.h" 2 #import "ViewController.h" 3 4 @interface AppDelegate () 5 6 @end 7 8 @implementation AppDelegate 9 10 11 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 12 _window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 13 ViewController *viewController = [[ViewController alloc] 14 initWithSampleNameArray:@[ kTitleOfXMLRequest, 15 kTitleOfJSONRequest ]]; 16 _navigationController = [[UINavigationController alloc] initWithRootViewController:viewController]; 17 _window.rootViewController = _navigationController; 18 //[_window addSubview:_navigationController.view]; //当_window.rootViewController关联时,这一句可有可无 19 [_window makeKeyAndVisible]; 20 return YES; 21 } 22 23 - (void)applicationWillResignActive:(UIApplication *)application { 24 } 25 26 - (void)applicationDidEnterBackground:(UIApplication *)application { 27 } 28 29 - (void)applicationWillEnterForeground:(UIApplication *)application { 30 } 31 32 - (void)applicationDidBecomeActive:(UIApplication *)application { 33 } 34 35 - (void)applicationWillTerminate:(UIApplication *)application { 36 } 37 38 @end