使用 AFNetworking 進行 XML 和 JSON 資料請求

weixin_33831673發表於2015-09-19

(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:@"廣州近三天天氣情況:\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:&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

 

相關文章