zoukankan      html  css  js  c++  java
  • 使用 AFNetworking 进行 XML 和 JSON 数据请求

    (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>
    View Code

     

    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 }
    View Code 

    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>
    View Code

     

    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:@"广州近三天天气情况:
    "];
     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:@"
     %@", arrWeatherInfo[6]];
     52         NSUInteger len = mStrWeatherInfo.length - loc;
     53         NSValue *valObj = [NSValue valueWithRange:NSMakeRange(loc, len)];
     54         [mArrRange addObject:valObj];
     55         [mStrWeatherInfo appendFormat:@"
     %@", arrWeatherInfo[5]];
     56         [mStrWeatherInfo appendFormat:@"
     %@", arrWeatherInfo[7]];
     57         [mStrWeatherInfo appendFormat:@"
     %@", arrWeatherInfo[10]];
     58         
     59         loc = mStrWeatherInfo.length;
     60         [mStrWeatherInfo appendFormat:@"
    
     %@", arrWeatherInfo[13]];
     61         len = mStrWeatherInfo.length - loc;
     62         valObj = [NSValue valueWithRange:NSMakeRange(loc, len)];
     63         [mArrRange addObject:valObj];
     64         [mStrWeatherInfo appendFormat:@"
     %@", arrWeatherInfo[12]];
     65         [mStrWeatherInfo appendFormat:@"
     %@", arrWeatherInfo[14]];
     66         
     67         loc = mStrWeatherInfo.length;
     68         [mStrWeatherInfo appendFormat:@"
    
     %@", arrWeatherInfo[18]];
     69         len = mStrWeatherInfo.length - loc;
     70         valObj = [NSValue valueWithRange:NSMakeRange(loc, len)];
     71         [mArrRange addObject:valObj];
     72         [mStrWeatherInfo appendFormat:@"
     %@", arrWeatherInfo[17]];
     73         [mStrWeatherInfo appendFormat:@"
     %@", arrWeatherInfo[19]];
     74         
     75         [mStrWeatherInfo appendFormat:@"
    
     %@", 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:&currentRange];
     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>
    View Code 

    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.dataSource = self;
     39     _tableView.delegate = self;
     40     //设置边距,解决单元格分割线默认偏移像素过多的问题
     41     if ([_tableView respondsToSelector:@selector(setSeparatorInset:)]) {
     42         [_tableView setSeparatorInset:UIEdgeInsetsZero]; //设置单元格(上左下右)内边距
     43     }
     44     if ([_tableView respondsToSelector:@selector(setLayoutMargins:)]) {
     45         [_tableView setLayoutMargins:UIEdgeInsetsZero]; //设置单元格(上左下右)外边距
     46     }
     47     [self.view addSubview:_tableView];
     48     
     49     //注册可复用的单元格
     50     UINib *nib = [UINib nibWithNibName:@"KMTableViewCell" bundle:nil];
     51     [_tableView registerNib:nib forCellReuseIdentifier:cellIdentifier];
     52     
     53     //空数据时,显示的提示内容
     54     _lblEmptyDataMsg = [[UILabel alloc] initWithFrame:CGRectMake(0.0, 0.0, 300.0, 50.0)];
     55     CGPoint newPoint = _tableView.center;
     56     newPoint.y -= 45.0;
     57     _lblEmptyDataMsg.center = newPoint;
     58     _lblEmptyDataMsg.text = @"点击「发送请求」按钮获取全球新闻信息";
     59     _lblEmptyDataMsg.textColor = [UIColor grayColor];
     60     _lblEmptyDataMsg.textAlignment = NSTextAlignmentCenter;
     61     _lblEmptyDataMsg.font = [UIFont systemFontOfSize:16.0];
     62     [_tableView addSubview:_lblEmptyDataMsg];
     63     
     64     //点击单元格时,显示的新闻信息详细内容
     65     frame = CGRectMake(10.0, CGRectGetMidY(rect) - 200.0, rect.size.width - 20.0, 400.0);
     66     _webView = [[UIWebView alloc] initWithFrame:frame];
     67     _webView.layer.borderColor = [UIColor lightGrayColor].CGColor;
     68     _webView.layer.borderWidth = 1.0;
     69     _webView.delegate = self;
     70     _webView.hidden = YES;
     71     [self.view addSubview:_webView];
     72     
     73     [AFNetworkActivityIndicatorManager sharedManager].enabled = YES;
     74 }
     75 
     76 - (NSString *)displayTimeFromCreatedAt:(NSString *)createdAt {
     77     NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
     78     [dateFormat setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss'Z'"]; //「2015-09-15T13:23:28Z」
     79     NSDate *date = [dateFormat dateFromString:createdAt];
     80     
     81     NSTimeZone *zone = [NSTimeZone systemTimeZone];
     82     NSInteger interval = [zone secondsFromGMTForDate:date]; //跟 GMT 时间相差8小时
     83     date = [date dateByAddingTimeInterval:interval];
     84     [dateFormat setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; //转化为「2015-09-15 21:23:28」
     85     NSString *displayTime = [dateFormat stringFromDate:date];
     86     return displayTime;
     87 }
     88 
     89 - (void)loadData:(NSArray *)arrData {
     90     _mArrCell = [NSMutableArray new];
     91     [arrData enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
     92         NSMutableDictionary *mDicCell = [NSMutableDictionary new];
     93         NSDictionary *dicRoot = (NSDictionary *)obj;
     94         NSArray *arrLink = [dicRoot valueForKeyPath:@"entities.links"];
     95         [mDicCell setValue:[NSString stringWithFormat:@"%@?w=80&h=80",
     96                            [dicRoot valueForKeyPath:@"user.avatar_image.url"]]
     97                    forKey:kAvatarImageStr];
     98         [mDicCell setValue:[dicRoot valueForKeyPath:@"user.name"] forKey:kName];
     99         [mDicCell setValue:[dicRoot valueForKey:@"text"] forKey:kText];
    100         [mDicCell setValue:(arrLink.count > 0 ? [arrLink[0] valueForKey:@"url"] : @"")
    101                     forKey:kLink];
    102         [mDicCell setValue:[self displayTimeFromCreatedAt:[dicRoot valueForKey:@"created_at"]]
    103                     forKey:kCreatedAt];
    104         [_mArrCell addObject:mDicCell];
    105     }];
    106     [self.tableView reloadData];
    107 }
    108 
    109 - (IBAction)sendRequest:(id)sender {
    110     _lblEmptyDataMsg.text = @"加载中...";
    111     _webView.hidden = YES;
    112     
    113     //方法一:AFHTTPRequestOperation
    114 //    NSURL *requestURL = [NSURL URLWithString:kJSONRequestURLStr];
    115 //    NSURLRequest *request = [NSURLRequest requestWithURL:requestURL];
    116 //    AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:request];
    117 //    op.responseSerializer = [AFJSONResponseSerializer serializer];
    118 //    [op setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
    119 //        NSDictionary *dic = (NSDictionary *)responseObject;
    120 //        [self loadData:(NSArray *)dic[@"data"]];
    121 //    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    122 //        NSLog(@"Error: %@", error);
    123 //    }];
    124 //    //start 是 AFNetworking 的自定义方法,他在自定义的线程中去执行操作;不是 NSOperation 对象实例的 start 方法,所以可以不用使用把操作添加到操作主队列的方法:[[NSOperationQueue mainQueue] addOperation:op]
    125 //    [op start];
    126     
    127     //方法二:AFHTTPRequestOperationManager
    128     AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    129     [manager GET:kJSONRequestURLStr parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
    130         NSDictionary *dic = (NSDictionary *)responseObject;
    131         [self loadData:(NSArray *)dic[@"data"]];
    132     } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    133         NSLog(@"Error: %@", error);
    134     }];
    135 }
    136 
    137 - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    138     _webView.hidden = YES;
    139 }
    140 
    141 #pragma mark - TableView
    142 - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    143     return @"全球新闻信息列表";
    144 }
    145 
    146 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    147     return 1;
    148 }
    149 
    150 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    151     NSUInteger count = _mArrCell.count;
    152     _lblEmptyDataMsg.hidden = count > 0;
    153     
    154     return count;
    155 }
    156 
    157 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    158     KMTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    159     if (!cell) {
    160         cell = [[KMTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
    161                                       reuseIdentifier:cellIdentifier];
    162     }
    163     
    164     NSMutableDictionary *mDicCell = _mArrCell[indexPath.row];
    165     cell.avatarImageStr = mDicCell[kAvatarImageStr];
    166     cell.name = mDicCell[kName];
    167     cell.text = mDicCell[kText];
    168     cell.createdAt = mDicCell[kCreatedAt];
    169     cell.haveLink = [mDicCell[kLink] length] > 0; //可以通过 isHaveLink 或 haveLink 获取值
    170     return cell;
    171 }
    172 
    173 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    174     return 90.0;
    175 }
    176 
    177 - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    178     /*
    179      viewDidLoad 中对应的操作
    180     if ([_tableView respondsToSelector:@selector(setSeparatorInset:)]) {
    181         [_tableView setSeparatorInset:UIEdgeInsetsZero]; //设置单元格(上左下右)内边距
    182     }
    183     if ([_tableView respondsToSelector:@selector(setLayoutMargins:)]) {
    184         [_tableView setLayoutMargins:UIEdgeInsetsZero]; //设置单元格(上左下右)外边距
    185     }
    186      */
    187     
    188     if ([cell respondsToSelector:@selector(setSeparatorInset:)]) {
    189         [cell setSeparatorInset:UIEdgeInsetsZero];
    190     }
    191     if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
    192         [cell setLayoutMargins:UIEdgeInsetsZero];
    193     }
    194 }
    195 
    196 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    197     NSMutableDictionary *mDicCell = _mArrCell[indexPath.row];
    198     NSString *link = mDicCell[kLink];
    199     if (link.length > 0) {
    200         //使用浏览器打开网址
    201         //[link openByBrowser];
    202         
    203         //使用 WebView 打开网址;由于这里很多网址是外国的,存在有的访问不了、有的访问慢导致加载超时的情况
    204         NSURLRequest *request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:link]];
    205         [_webView loadRequest:request];
    206         _webView.hidden = NO;
    207     }
    208 }
    209 
    210 #pragma mark - WebView
    211 - (void)webViewDidStartLoad:(UIWebView *)webView {
    212     kApplication.networkActivityIndicatorVisible = YES;
    213 }
    214 
    215 - (void)webViewDidFinishLoad:(UIWebView *)webView {
    216     kApplication.networkActivityIndicatorVisible = NO;
    217 }
    218 
    219 - (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error {
    220     NSLog(@"Error: %@", error);
    221     webView.hidden = YES;
    222     kApplication.networkActivityIndicatorVisible = NO;
    223     UIAlertView *alertVCustom = [[UIAlertView alloc] initWithTitle:@"提示信息"
    224                                                            message:@"网络连接错误"
    225                                                           delegate:nil
    226                                                  cancelButtonTitle:@"确定"
    227                                                  otherButtonTitles:nil, nil];
    228     [alertVCustom show];
    229 }
    230 
    231 @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>
    View Code 

    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
  • 相关阅读:
    计算机网络面试小知识总结(转载)
    williamisnotme@gmail.com
    jdk1,8 HashMap
    Mybatis 为什么不要用二级缓存
    CPU,寄存器,一缓二缓.... RAM ROM 外部存储器等简介
    一级缓存,二级缓存
    mock单测
    java8函数式编程(转载)
    volatile解析
    JVM 技术分享(初级)
  • 原文地址:https://www.cnblogs.com/huangjianwu/p/4822072.html
Copyright © 2011-2022 走看看