目录
一. 实现满座网的界面
- 导入图片和GDataXML
- 标签栏视图控制器
- 编写MyDownloader类封装下载数据功能
- 建立模型, 创建tableViewCell(该步骤的位置可以提前)
- 视图控制器中下载数据, 利用GDataXML解析XML数据, 并作为数据源
- 创建tableView并显示cell
- 创建headView和headView的数据模型
- 显示headView
- 下拉刷新(MJRefresh)
二. 和讯界面
一. 实现满座网的界面
-
导入图片和GDataXML
-
标签栏视图控制器
- (void)createTabBarCtrl { // 视图控制器 NSArray *ctrlArray = @[@"HomePageController", @"NearbyViewController", @"SearchViewController", @"MineViewController"]; // 标题 NSArray *titleArray = @[@"首页", @"周边", @"搜索", @"我的"]; // 图片 NSArray *imageArray = @[@"main", @"around", @"search", @"myManzuo"]; // 循环创建视图控制器 NSMutableArray *array = [NSMutableArray array]; for (int i = 0; i < ctrlArray.count; i++) { // 创建视图控制器 Class cls = NSClassFromString(ctrlArray[i]); UIViewController *ctrl = [[cls alloc] init]; // 设置图片和文字 ctrl.tabBarItem.title = titleArray[i]; ctrl.tabBarItem.image = [UIImage imageNamed:imageArray[i]]; // 导航 UINavigationController *navCtrl = [[UINavigationController alloc] initWithRootViewController:ctrl]; [array addObject:navCtrl]; } // 创建标签栏视图控制器 UITabBarController *tabCtrl = [[UITabBarController alloc] init]; tabCtrl.viewControllers = array; // 主窗口的视图控制器 self.window.rootViewController = tabCtrl; }
-
在for循环中快速创建不同的视图控制器
// 视图控制器 NSArray *ctrlArray = @[@"HomePageController", @"NearbyViewController", @"SearchViewController", @"MineViewController"]; // 循环创建视图控制器 NSMutableArray *array = [NSMutableArray array]; for (int i = 0; i < ctrlArray.count; i++) { // 创建视图控制器 Class cls = NSClassFromString(ctrlArray[i]); UIViewController *ctrl = [[cls alloc] init]; // 导航 UINavigationController *navCtrl = [[UINavigationController alloc] initWithRootViewController:ctrl]; [array addObject:navCtrl];
-
-
编写MyDownloader类封装下载数据功能
-
MyDownloader.h
#import
@class MyDownloader; @protocol MyDownloaderDelegate // 下载失败时; 传入MyDownloader是因为在同一个视图控制器中用多个MyDownloader对象分别下载数据时区分对象 - (void)downloadFailWithError:(NSError *)error inDownloader:(MyDownloader *)downloader; // 下载成功时 - (void)downloadFinish:(MyDownloader *)downloader; @end @interface MyDownloader : NSObject { // 存储下载数据 NSMutableData *_receiveData; NSURLConnection *_connection; } // 获取下载到的数据, readonly可以使外界不能修改指针指向的地址, NSData可以使其指向地址中的那个值不能改变 @property (nonatomic, readonly) NSMutableData *receivedData; // 代理属性 @property (nonatomic, weak) id delegate; // type属性, 区分不同的下载对象 @property (nonatomic, assign) NSInteger type; // 下载的方法 - (void)downloadWithUrlString:(NSString *)urlString; @end -
MyDownloader.m
#import "MyDownloader.h" @implementation MyDownloader - (instancetype)init { self = [super init]; if (self) { // 初始化数据 _receivedData = [NSMutableData data]; } return self; } - (void)downloadWithUrlString:(NSString *)urlString { _connection = [NSURLConnection connectionWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:urlString]] delegate:self]; } #pragma mark - NSURLConnection相关代理方法 // 下载失败 - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { if (self.delegate) { [self.delegate downloadFailWithError:error inDownloader:self]; } } // 请求返回时调用的方法 - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { // 将之前下载的数据清空 [_receivedData setLength:0]; } // 每次下载数据返回时调用的方法 - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { [_receivedData appendData:data]; } // 下载结束调用的方法, 会自动回到主线程 - (void)connectionDidFinishLoading:(NSURLConnection *)connection { if (self.delegate) { [self.delegate downloadFinish:self]; } } @end
-
-
建立模型, 创建tableViewCell(该步骤的位置可以提前)
-
视图控制器中下载数据, 利用GDataXML解析XML数据, 并作为数据源
// 利用GData进行XML解析的代码(GDataXML) // 1. 导入GDataXML第三方库 // 2. GDataXML不支持ARC, 设置编译属性"fno-objc-arc" // 3. 添加系统依赖库libxml2.dylib // 4. header search path 添加 /usr/include/libxml2 // 1> 创建一个GDataXMLDocument对象 GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:downloader.receivedData options:0 error:nil]; // 2> 获取节点, 取得所有的promotion节点 NSArray *promotionArray = [doc nodesForXPath:@"/response/list/promotion" error:nil]; for (GDataXMLElement *element in promotionArray) { // 每一个element对应一个promotion节点 // 创建数据模型对象 PromotionModel *model = [[PromotionModel alloc] init]; // 给属性赋值 NSArray *wsdimgNodes = [element elementsForName:@"wsdimg"]; // 取到唯一的wsdimg子节点 GDataXMLElement *wsdimgElement = [wsdimgNodes lastObject]; // 获取节点里面的值 model.wsdimg = [wsdimgElement stringValue]; model.multipagetitle = [[[element elementsForName:@"multipagetitle"] lastObject] stringValue]; model.price = [[[element elementsForName:@"price"] lastObject] stringValue]; model.priceoff = [[[element elementsForName:@"priceoff"] lastObject] stringValue]; model.currentdealcount = [[[element elementsForName:@"currentdealcount"] lastObject] stringValue]; model.district = [[[element elementsForName:@"district"] lastObject] stringValue]; [self.dataArray addObject:model]; }
-
创建tableView并显示cell
-
创建headView和headView的数据模型
-
显示headView
- (void)downloadFinish:(MyDownloader *)downloader { if (downloader.type == 100) { // 列表数据 ………………………………………………………………………………………………………………………… } [self.tbView reloadData]; if (downloader.type == 200) { // headView的数据 ………………………………………………………………………………………………………………………… } // 显示到表格的头部视图 HeadView *header = [[HeadView alloc] initWithFrame:CGRectMake(0, 0, 375, 160)]; header.activityArray = self.activityArray; _tbView.tableHeaderView = header; } }
-
下拉刷新(MJRefresh)
在MJRefreshConst.h和MJRefreshConst.m中都要导入头文件
#import
#import ………………………………………………………………………………………………………………………… * 用于下拉刷新的头文件 #import "MJRefresh.h" /* 上拉下拉刷新 MJRefresh: 项目不是太大(有一些小bug) EGORefresh: 项目比较大 */ ………………………………………………………………………………………………………………………… @interface HomePageController () <…………………………………………………………………………… , MJRefreshBaseViewDelegate> ………………………………………………………………………………………………………………………… // 刷新 @property (nonatomic, strong) MJRefreshHeaderView *headerView; @property (nonatomic, strong) MJRefreshFooterView *footerView; // 从第几个数据开始下载 @property (nonatomic, assign) NSInteger offset; // 一次下载多少个数据 @property (nonatomic, assign) NSInteger pageSize; @end @implementation HomePageController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. _offset = 1; _pageSize = 20; ………………………………………………………………………………………………………………………… } - (void)createTableView { ………………………………………………………………………………………………………………………… // 下拉刷新 _headerView = [MJRefreshHeaderView header]; _headerView.scrollView = _tbView; _headerView.delegate = self; _footerView = [MJRefreshFooterView footer]; _footerView.scrollView = _tbView; _footerView.delegate = self; } // 下载数据 - (void)downloadData { // 1. 创建MyDownloader对象 // 2. 设置代理 // 3. 设置type值 // 4. 下载 [downloader downloadWithUrlString:[NSString stringWithFormat:kMAIN_SHOP_URL, self.offset, self.pageSize]]; } #pragma mark - MJRefresh代理 - (void)refreshViewBeginRefreshing:(MJRefreshBaseView *)refreshView { if (refreshView == _headerView) { // 下拉刷新 self.offset = 1; [self downloadActivityData]; [self downloadData]; } else if (refreshView == _footerView) { // 上拉加载更多 self.offset += self.pageSize; [self downloadData]; } } ………………………………………………………………………………………………………………………… // 下载数据 - (void)downloadData { _isLoading = YES; ………………………………………………………………………………………………………………………… } #pragma mark - UITableView相关代理方法 ………………………………………………………………………………………………………………………… #pragma mark - MyDownloaderDelegate中方法 // 下载失败 - (void)downloadFailWithError:(NSError *)error inDownloader:(MyDownloader *)downloader { if (downloader.type == 100) { NSLog(@"列表数据: %@", error); self.isLoading = NO; } if (downloader.type == 200) { NSLog(@"headView数据: %@", error); } } // 下载成功 - (void)downloadFinish:(MyDownloader *)downloader { if (downloader.type == 100) { // 列表数据 if (_offset == 1) { // 第一次下载或者是下拉刷新 [_dataArray removeAllObjects]; ………………………………………………………………………………………………………………………… } [self.tbView reloadData]; _isLoading = NO; // 结束刷新 [self.headerView endRefreshing]; [self.headerView endRefreshing]; if (downloader.type == 200) { ………………………………………………………………………………………………………………………… } } - (void)dealloc { _headerView.scrollView = nil; _footerView.scrollView = nil; } @end