我透過JSON的方式來取得資料,並且可以從網路上取得,並且當資料有變動的時候,透過Table View
向下拉的方式來更新資料。我的JSON資料是透過php程式來撰寫。首先先來建置一個簡單的資料表。如下圖,在Table View
的部分會呈現名字,當點選名字後會看到該名字的電話號碼。
php程式碼
1 2 3 4 5 6 7 8
| <?php include('db.php'); $query = mysql_query('SELECT * FROM user'); $json_data = array(); while($row = mysql_fetch_assoc($query)) { $json_data[] = $row; } echo json_encode($json_data);
|
**Step 1.**建立Master Detail Application
專案。
建立完成專案後先開始編輯MasterViewController.h
。建立一個NSMutableArray
型態的json_array
物件。
MasterViewController.h1 2 3 4
| #import <UIKit/UIKit.h> @interface MasterViewController : UITableViewController @property (strong, nonatomic) NSMutableArray *json_array; @end
|
**Step 2.**編輯MasterViewController.m
在viewDidLoad
方法內加入下面的程式碼
MasterViewController.m1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| @implementation MasterViewController @synthesize json_array; - (void)viewDidLoad { [super viewDidLoad]; NSURL *url = [NSURL URLWithString:@"http://XXX.XXX/json.php"]; NSData *jsonData=[NSData dataWithContentsOfURL:url]; NSError *error = nil; json_array = [NSJSONSerialization JSONObjectWithData:jsonData options: NSJSONReadingMutableContainers error:&error]; }
|
- 在上面的程式碼一開始定義一個
NSURL
類別的url
變數,該變數很明顯的可以看到要連接的網頁網址!
- 將
url
網址的資料存放到NSData
類別的jsonData
變數中。
- 接著將取得到的結果放到
json
陣列中,當中可以看到options:NSJSONReadingMutableContainers
這段,這意思是將jsonData
取得的JSON
資料轉為NSMutableDictionary
,之後再取得名稱或電話時可以objecForKey
的方式來取得。
接著修改Table View Cell
的回傳個數
MasterViewController.m1 2 3 4
| - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return json_array.count; }
|
修改Cell
顯示的文字,這邊需要透過objectForKey
方法指定Key值為。
MasterViewController.m1 2 3 4 5 6
| - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath]; cell.textLabel.text = [[json_array objectAtIndex:indexPath.row] objectForKey:@"u_name"]; return cell; }
|
傳遞參數也需要修改一下。
MasterViewController.m1 2 3 4 5 6 7 8
| - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([[segue identifier] isEqualToString:@"showDetail"]) { NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow]; [[segue destinationViewController] setDetailItem:[json_array objectAtIndex:indexPath.row]]; } }
|
將JSON
的資料放入Table View
中會如下圖所示(資料內容有新增修改過)。
接下來當我MySql
有新增資料,或是刪除資料時,我想要同步更新到Table View
中,所以我使用了PullToRefresh
這個套件。網路上蠻多人都說EGOTableViewPullRefresh
這套,但是它似乎不支援ARC
,所以我就改用別的了。
這個套件使用上很簡單!首先下載好它的檔案Here,並加入專案內。
接著加入QuartzCore.framework
。
修改MasterViewController.h
,程式碼如下:
MasterViewController.m1 2 3 4 5 6 7
| #import <UIKit/UIKit.h> #import "PullToRefreshView.h"
@interface MasterViewController : UITableViewController<PullToRefreshViewDelegate> //2 @property (strong, nonatomic) NSMutableArray *json_array; @property (strong, nonatomic) PullToRefreshView *pull; @end
|
回到MasterViewController.m
在viewDidLoad
將PullToRefresh
加入到Table View
中。
MasterViewController.m1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| @implementation MasterViewController @synthesize json_array, pull; - (void)viewDidLoad { [super viewDidLoad]; NSURL *url = [NSURL URLWithString:@"http://lighter.cp22.secserverpros.com/lighter127/JSON/json.php"]; NSData *jsonData=[NSData dataWithContentsOfURL:url]; NSError *error = nil; json_array = [NSJSONSerialization JSONObjectWithData:jsonData options: NSJSONReadingMutableContainers error:&error];
pull = [[PullToRefreshView alloc] initWithScrollView:(UIScrollView *) self.tableView]; [pull setDelegate:self]; [self.tableView addSubview:pull]; }
|
當Table View
往下拉的時候會呼叫pullToRefreshViewShouldRefresh:
方法。這裡我會呼叫另一個自定的方法reloadTableData
,而在該方法內我重新再連一次json.php
的網頁並更新json_array
的內容,最後才呼叫tableView
的reloadData
。
當資料更新結束後,呼叫finishedLoading
方法,結束Pull Refresh
的動作。
MasterViewController.m1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| #pragma mark - Table View Pull Refresh
- (void)pullToRefreshViewShouldRefresh:(PullToRefreshView *)view; { [self reloadTableData]; }
- (void)reloadTableData { NSURL *url = [NSURL URLWithString:@"http://XXX.XXX/json.php"]; NSData *jsonData=[NSData dataWithContentsOfURL:url]; NSError *error = nil; json_array = [NSJSONSerialization JSONObjectWithData:jsonData options: NSJSONReadingMutableContainers error:&error]; [self.tableView reloadData]; [pull finishedLoading]; }
|
註:由於向下捲動Table View
的速度比我截圖速度快….我就放棄了…
#參考資料
- PullToRefresh iOS 5 and ARC Tutorial
- PullToRefresh
- EGOTableViewPullRefresh