Ipad UISplitViewController
2016-03-25 20:52
513 查看
这篇文章是关于一个ipad里面的视图控制器的用法
首先介绍下ipad我们用storyboard构建的界面
关于界面
1.拖UISplitViewController进入storyboard
有一点需要说明的是 关于UITextView UITextView是能自适应高度的滚动视图 我们构建界面时 只需要设置其离bottom得距离 它就会自动布局好里面的文字
tableView里面cell定制中Lable也是一样的只需要设置bottom的距离
以前就讲过关于自动生成jsonmodel 还有一点关于里面的小细节
第一:如果生成的属性名称和系统的名称有冲突
处理方法:pod yymodel.h 要修改的遵从yymodel协议
具体处理看代码:
第二:如果模型中还有数组
那我们应该对数组做处理 数组也会自动生成一个模型
在对它们做映射
首先介绍下ipad我们用storyboard构建的界面
关于界面
1.拖UISplitViewController进入storyboard
有一点需要说明的是 关于UITextView UITextView是能自适应高度的滚动视图 我们构建界面时 只需要设置其离bottom得距离 它就会自动布局好里面的文字
tableView里面cell定制中Lable也是一样的只需要设置bottom的距离
以前就讲过关于自动生成jsonmodel 还有一点关于里面的小细节
第一:如果生成的属性名称和系统的名称有冲突
处理方法:pod yymodel.h 要修改的遵从yymodel协议
具体处理看代码:
//改之前 @property (nonatomic, copy) NSString *description; //改之后 @property (nonatomic, copy) NSString *desc; 处理方法.m文件model中 // 关联属性和JSON的key + (NSDictionary *)modelCustomPropertyMapper { return @{@"desc" : @"description"}; } 一定要在对应的模型中哦
第二:如果模型中还有数组
那我们应该对数组做处理 数组也会自动生成一个模型
在对它们做映射
//例子 @property (nonatomic, strong) NSArray *photos; 处理方法.m文件model中 // 关联属性和类 + (NSDictionary *)modelContainerPropertyGenericClass { return @{@"photos" : [PhotosModel class]}; }
//sdwebimage方法请求网络数据 #import <UIImageView+WebCache.h> [self.iconImageView sd_setImageWithURL:[NSURL URLWithString:_model.iconUrl] placeholderImage:[UIImage imageNamed:@"favicon"]];
具体过程 master 页面 #import "MasterViewController.h" #import "AppListCell.h" #import "AppListModel.h" #import <YYModel.h> #import <AFNetworking.h> #import <MJRefresh.h> #define IDENTIFIER @"CELL" @interface MasterViewController () - (IBAction)shareAction:(UIBarButtonItem *)sender; @property (nonatomic, strong) NSMutableArray * dataSourceArray; // 数据源数组 @property (nonatomic, assign) NSInteger currentPage; // 记录当前请求页 @property (nonatomic, strong) AFHTTPSessionManager * sessionManager; // 网络请求对象 @end @implementation MasterViewController - (IBAction)shareAction:(UIBarButtonItem *)sender { // 创建ContentVC UIImagePickerController * pickerVC = [[UIImagePickerController alloc] init]; pickerVC.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum; pickerVC.mediaTypes = [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeSavedPhotosAlbum]; // 创建UIPopoverController UIPopoverController * popoverVC = [[UIPopoverController alloc] initWithContentViewController:pickerVC]; // 显示 [popoverVC presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; // 参数1:指定位置的Rect,在什么地方显示 // [popoverVC presentPopoverFromRect:CGRectMake(50, 50, 200, 200) inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; } // 懒加载 - (NSMutableArray *)dataSourceArray { if (!_dataSourceArray) { _dataSourceArray = [NSMutableArray array]; } return _dataSourceArray; } // 懒加载 - (AFHTTPSessionManager *)sessionManager { if (!_sessionManager) { _sessionManager = [AFHTTPSessionManager manager]; // 设置请求数据的格式 // 返回数据格式的序列化,JSON、XML、二进制数据 // // 二进制数据序列化 // _sessionManager.responseSerializer = [AFHTTPResponseSerializer serializer]; // // JSON数据序列化,默认方式 // _sessionManager.responseSerializer = [AFJSONResponseSerializer serializer]; // // XML数据序列化 // _sessionManager.responseSerializer = [AFXMLParserResponseSerializer serializer]; _sessionManager.responseSerializer.acceptableContentTypes = [_sessionManager.responseSerializer.acceptableContentTypes setByAddingObject:@"text/html"]; } return _sessionManager; } - (void)viewDidLoad { [super viewDidLoad]; // 配置UITableView // 要实现UITableViewCell自动计算行高,满足三个条件: // 1. iOS 8 // 2. 单元格中只有一个可变高度的视图 // 3. 设置的视图约束,必须建立和父视图的上下约束 // 设置2个步骤: // 1. 设置行高为:UITableViewAutomaticDimension self.tableView.rowHeight = UITableViewAutomaticDimension; // 2. 设置估算行高为不为0的值 self.tableView.estimatedRowHeight = 100; __weak typeof(self) weakSelf = self; // 设置MJRefresh // 设置下拉刷新 self.tableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{ weakSelf.currentPage = 1; [weakSelf requestWithPage:weakSelf.currentPage]; }]; // 设置上拉加载更多 self.tableView.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingBlock:^{ weakSelf.currentPage++; [weakSelf requestWithPage:weakSelf.currentPage]; }]; // 首次请求 [self.tableView.mj_header beginRefreshing]; } // 请求数据 - (void)requestWithPage:(NSInteger)page { __weak typeof(self) weakSelf = self; // 拼接请求地址 NSString * appListURL = [NSString stringWithFormat:LimitFreeURL, page]; // 通过AFHTTPSessionManager的GET方式请求数据 [self.sessionManager GET:appListURL parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) { // 请求数据成功 // 首页数据 if (page == 1) { // 移除数据源所有数据 [weakSelf.dataSourceArray removeAllObjects]; } // 将新请求的数据添加到数据源中 AppListModel * model = [AppListModel yy_modelWithJSON:responseObject]; [weakSelf.dataSourceArray addObjectsFromArray:model.applications]; // 刷新视图 dispatch_async(dispatch_get_main_queue(), ^{ [weakSelf.tableView reloadData]; // 停止刷新 [weakSelf.tableView.mj_header endRefreshing]; [weakSelf.tableView.mj_footer endRefreshing]; }); } failure:^(NSURLSessionDataTask *task, NSError *error) { NSLog(@"error = %@", error.localizedDescription); if (page > 1) { weakSelf.currentPage--; } // 回到主线程刷新视图 dispatch_async(dispatch_get_main_queue(), ^{ // 停止刷新 [weakSelf.tableView.mj_header endRefreshing]; [weakSelf.tableView.mj_footer endRefreshing]; }); }]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } #pragma mark - Table view data source - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return self.dataSourceArray.count; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { AppListCell *cell = [tableView dequeueReusableCellWithIdentifier:IDENTIFIER forIndexPath:indexPath]; // 获取数据模型 ApplicationsModel * model = self.dataSourceArray[indexPath.row]; cell.model = model; return cell; } #pragma mark - UITableViewDelegate - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { // 获取选中单元格的数据 ApplicationsModel * model = self.dataSourceArray[indexPath.row]; // 发送通知 [[NSNotificationCenter defaultCenter] postNotificationName:MasterToDetailNotification object:model.applicationId]; } detail 页面 #import "DetailViewController.h" #import "AppDetailModel.h" #import <AFNetworking.h> #import <UIImageView+WebCache.h> // 等待加载框,菊花转 #import <MBProgressHUD.h> @interface DetailViewController () @property (weak, nonatomic) IBOutlet UIImageView *iconImageView; @property (weak, nonatomic) IBOutlet UILabel *titleLabel; @property (weak, nonatomic) IBOutlet UILabel *categoryLabel; @property (weak, nonatomic) IBOutlet UILabel *descLabel; @property (weak, nonatomic) IBOutlet UITextView *longDescLabel; @property (nonatomic, strong) AFHTTPSessionManager * httpManager; @property (nonatomic, strong) AppDetailModel * detailModel; // 应用详情 @property (nonatomic, copy) NSString * applicationID; // 应用ID @end @implementation DetailViewController - (AFHTTPSessionManager *)httpManager { if (!_httpManager) { _httpManager = [AFHTTPSessionManager manager]; _httpManager.responseSerializer.acceptableContentTypes = [_httpManager.responseSerializer.acceptableContentTypes setByAddingObject:@"text/html"]; } return _httpManager; } - (void)dealloc { // 移除通知中心的观察者 [[NSNotificationCenter defaultCenter] removeObserver:self]; } - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateApplicationID:) name:MasterToDetailNotification object:nil]; } - (void)updateApplicationID:(NSNotification *) notif { self.applicationID = notif.object; // 取消NSOperationQueue中所有的操作 [self.httpManager.operationQueue cancelAllOperations]; // 请求数据 [self requestAppDetail]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } // 请求应用详情数据 - (void)requestAppDetail { [MBProgressHUD showHUDAddedTo:self.view animated:YES]; __weak typeof(self) weakSelf = self; // 拼接URL NSString * detailURL = [NSString stringWithFormat:AppDetailURL, self.applicationID]; // 请求数据 [self.httpManager GET:detailURL parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) { // 将JSON数据转变为模型数据 weakSelf.detailModel = [AppDetailModel yy_modelWithJSON:responseObject]; // 回到主线程刷新视图 dispatch_async(dispatch_get_main_queue(), ^{ [weakSelf updateUI]; [MBProgressHUD hideHUDForView:self.view animated:YES]; }); } failure:^(NSURLSessionDataTask *task, NSError *error) { NSLog(@"error = %@", error.localizedDescription); }]; } - (void)updateUI { [self.iconImageView sd_setImageWithURL:[NSURL URLWithString:self.detailModel.iconUrl] placeholderImage:[UIImage imageNamed:@"favicon"]]; self.titleLabel.text = self.detailModel.name; self.categoryLabel.text = self.detailModel.categoryName; self.descLabel.text = self.detailModel.desc; self.longDescLabel.text = self.detailModel.description_long; }
相关文章推荐
- Queue和Stack
- uva 10534——Wavio Sequence
- poj2127 Greatest Common Increasing Subsequence(LICS+路径)
- Arduino自己封装库
- hdu4027 Can you answer these queries?(线段树)
- UItableView 或者UIcollectionview,点击cell时,无反应,
- frequent code on IOS
- a value of type "const struct Menu * "cannot be assigned to an entity of type "struct Menu"
- ACM程序设计选修课——1051: Glamor Sequence(YY+求和公式)
- leetcode——225—— Implement Stack using Queues
- POJ 2299 Ultra-QuickSort(逆序对数,线段树/树状数组/归并排序)
- requests模拟ajax异步请求
- Hbuilder 常用快捷键汇总
- 多线程——NSOperationQueue
- mui关于页面间传值的方法
- 关于如何修改UISearchBa灰色背景
- Android官方开发文档Training系列课程中文版:使用Fragment构建动态UI之Fragment创建
- Requirements 101: User Stories vs. Use Cases
- Handler原理笔记
- ggplot2快速教程Quick Introduction to ggplot2