使用步骤
要想显示一个UIPopoverController,需要经过下列步骤
设置内容控制器
由于UIPopoverController直接继承自NSObject,不具备可视化的能力
因此UIPopoverController上面的内容必须由另外一个继承自UIViewController的控制器来提供,这个控制器称为“内容控制器”
设置内容的尺寸
显示出来占据多少屏幕空间
设置显示的位置
从哪个地方冒出来
设置内容控制器
设置内容控制器有3种方法
在初始化UIPopoverController的时候传入一个内容控制器
- (id)initWithContentViewController:(UIViewController *) viewController;
@property (nonatomic, retain) UIViewController *contentViewController;
- (void)setContentViewController:(UIViewController*)viewController animated:(BOOL)animated;
以上方法和属性都是UIPopoverController的
设置内容的尺寸
设置内容的尺寸有2种方法
@property (nonatomic) CGSize popoverContentSize;
- (void)setPopoverContentSize:(CGSize)size animated:(BOOL)animated;
以上方法和属性都是UIPopoverController的
设置显示的位置
设置显示的位置有2种方法
围绕着一个UIBarButtonItem显示(箭头指定那个UIBarButtonItem)
- (void)presentPopoverFromBarButtonItem:(UIBarButtonItem *)item permittedArrowDirections:(UIPopoverArrowDirection)arrowDirections animated:(BOOL)animated;
item :围绕着哪个UIBarButtonItem显示
arrowDirections :箭头的方向
animated :是否通过动画显示出来
设置显示的位置
围绕着某一块特定区域显示(箭头指定那块特定区域)
- (void)presentPopoverFromRect:(CGRect)rect inView:(UIView
*)view permittedArrowDirections:(UIPopoverArrowDirection)arrowDirections
animated:(BOOL)animated;
rect :指定箭头所指区域的矩形框范围(位置和尺寸)
view :rect参数是以view的左上角为坐标原点(0,0)
arrowDirections:箭头的方向
animated :是否通过动画显示出来
设置显示的位置
• 如果想让箭头指向某一个UIView的做法有2种做法,比如指向一个button
• 方法1
[popover presentPopoverFromRect:button.bounds inView:button permittedArrowDirections:UIPopoverArrowDirectionDown animated:YES];
• 方法2
[popover presentPopoverFromRect:button.frame inView:button.superview permittedArrowDirections:UIPopoverArrowDirectionDown animated:YES];
常见报错
• 在popover的使用过程中,经常会遇到这个错误
-[UIPopoverController dealloc] reached while popover is still visible.
• 错误的大体意思是:popover在仍旧可见的时候被销毁了(调用了dealloc)
• 从错误可以得出的结论
• 当popover仍旧可见的时候,不准销毁popover对象
• 在销毁popover对象之前,一定先让popover消失(不可见)
通过内容控制器设置内容尺寸
• 内容控制器可以自行设置自己在popover中显示的尺寸
• 在iOS 7之前
@property (nonatomic,readwrite) CGSize contentSizeForViewInPopover;
• 从iOS 7开始
@property (nonatomic) CGSize preferredContentSize;
以上属性都是UIViewController的
常用属性
• 代理对象
@property (nonatomic, assign) id <UIPopoverControllerDelegate> delegate;
• 是否可见
@property (nonatomic, readonly, getter=isPopoverVisible) BOOL popoverVisible;
• 箭头方向
@property (nonatomic, readonly) UIPopoverArrowDirection popoverArrowDirection;
• 关闭popover(让popover消失)
- (void)dismissPopoverAnimated:(BOOL)animated;
防止点击UIPopoverController区域外消失
• 默认情况下
• 只要UIPopoverController显示在屏幕上,UIPopoverController背后的所有控件默认是不能跟用户进行正常交互的
• 点击UIPopoverController区域外的控件,UIPopoverController默认会消失
• 要想点击UIPopoverController区域外的控件时不让UIPopoverController消失,解决办法是设置passthroughViews属性
@property (nonatomic, copy) NSArray *passthroughViews;
• 这个属性是设置当UIPopoverController显示出来时,哪些控件可以继续跟用户进行正常交互。这样的话,点击区域外的控件就不会让UIPopoverController消失了
如何iPhone中实现popover的效果
• UIPopoverController这个类是只能用在iPad中的
• 要想在iPhone中实现popover效果,必须得自定义view,可以参考
• http://code4app.com/ios/Popover-View-in-iPhone/4fa931bd06f6e78d0f000000
• http://code4app.com/ios/Popup-Menu/512231ac6803fa9e08000000
*******************笔记*********************
UIPopoverController的简单使用
1.iPad特有的控制器
2.继承自NSObect,并非继承自UIViewController
2.1继承自NSObect:不是一个控件类的东西,就是不可见,不具备可视化能力,如果要让它可见,就要把它方法哦某个控件中,控制器才可以显示
2.2.继承自UIViewController或者UIview:UIViewController里面有个View,可以通View展示东西,如果继承UIView,可以把这个东西展示到这个UIView上面
3.特点:只占据屏幕的部分控件呈现信息,并显示在最前面
4.使用步骤(IOS8之前)
1.设置内容控制器
MenuViewController *menuVC = [[MenuViewController alloc] init];
2.初始化UIPopoverController并指定内容控制器(初始化的时候必须要指定)
UIPopoverController *menuPopover = [[UIPopoverController alloc] initWithContentViewController:menuVC];
3.设置内容控制器的大小
menuPopover.popoverContentSize = CGSizeMake(110, 44 * 3);
4.弹出UIPopverController,设置显示位置,并指定箭头方向
[menuPopover presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
- 4.退出UIPopverController
[menuPopover dismissPopoverAnimated:YES];
UIPopoverController的其他用法
- 一.导航条控制器的点击
1.懒加载
- (UIPopoverController *)controllerPopover
{
if (_controllerPopover == nil) {
1.创建内容控制器
OneViewController *oneVC = [[OneViewController alloc] init];
UINavigationController *oneNav = [[UINavigationController alloc] initWithRootViewController:oneVC];
2.初始化UIPopoverController并设置内容控制器
self.controllerPopover = [[UIPopoverController alloc] initWithContentViewController:oneNav];
}
return _controllerPopover;
}
-二.设置导航条内容
- (void)viewDidLoad {
[super viewDidLoad];
1.设置背景颜色
self.view.backgroundColor = [UIColor whiteColor];
2.添加导航条文字
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCamera target:nil action:nil];
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemEdit target:nil action:nil];
3.添加下一个控制器按钮
UIButton *nextBtn = [[UIButton alloc] init];
[nextBtn setTitle:@"到下一个控制器" forState:UIControlStateNormal];
nextBtn.backgroundColor = [UIColor redColor];
nextBtn.frame = CGRectMake(100, 100, 140, 40);
[self.view addSubview:nextBtn];
[nextBtn addTarget:self action:@selector(nextBtn) forControlEvents:UIControlEventTouchUpInside];
```
4.设置返回按钮样式
self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"返回" style:UIBarButtonItemStyleDone target:nil action:nil];
}
- (void)nextBtn
{
TwoViewController *twoVC = [[TwoViewController alloc] init];
[self.navigationController pushViewController:twoVC animated:YES];
}
-三.颜色的点击
懒加载
- (UIPopoverController *)colorPopver {
if (_colorPopver == nil) {
1.创建内容控制器
ColorViewController *colorVC = [[ColorViewController alloc] init];
2.创建UIPopverController,并设置内容控制器
_colorPopver = [[UIPopoverController alloc] initWithContentViewController:colorVC];
3.封装block代码
__weak typeof(self)weakSelf = self;
colorVC.colorChooseBlock = ^(UIColor *color){
1.设置背景颜色
self.view.backgroundColor = color;
2.popver消失
[weakSelf.colorPopver dismissPopoverAnimated:YES];
};
}
return _colorPopver;
}
点击
- (IBAction)colorClick:(UIButton *)sender {
[self.colorPopver presentPopoverFromRect:sender.bounds inView:sender permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
}
(void)viewDidLoad {
[super viewDidLoad];
1.设置图片的真实大小
self.preferredContentSize = self.imageView.image.size;
}-
(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
1.获取当前点击的点
CGPoint point = [[touches anyObject] locationInView:self.view];2.获取点的颜色
UIColor *color = [self.imageView.image pixelColorAtLocation:point];3.调用block
if (self.colorChooseBlock) {
self.colorChooseBlock(color);
}
}
- 四ios8点击
懒加载
-
(Ios8ViewController *)ios8VC {
if (_ios8VC == nil) {
1.创建内容控制器
_ios8VC = [[Ios8ViewController alloc] init];2.设置弹出样式为popover _ios8VC.modalPresentationStyle = UIModalPresentationPopover;
}
return _ios8VC;
}
弹出
-
(IBAction)ios8Click:(UIButton *)sender {
1.设置弹出位置
self.ios8VC.popoverPresentationController.sourceView = self.view;
self.ios8VC.popoverPresentationController.sourceRect = sender.frame;2.以modal的形式弹出
[self presentViewController:self.ios8VC animated:YES completion:nil];
}
美团界面搭建(一)
1.设置导航条背景图片(通过自定义导航条)
2.使用xib布局,设置导航条按钮
3.取消导航条图片渲染
- 一 自定义导航条,设置背景
/**
* 类在第一次使用的时候调用
*/
-
(void)initialize {
1.拿到navigationBar
UINavigationBar *navBar = [UINavigationBar appearance];2.设置背景颜色
[navBar setBackgroundImage:[UIImage imageNamed:@"bg_navigationBar_normal"] forBarMetrics:UIBarMetricsDefault];
}
- 二 添加导航条内容
-
(void)setupBarButtonItems
{
1.添加logo
UIBarButtonItem *logoItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"icon_meituan_logo"] style:UIBarButtonItemStyleDone target:nil action:nil];
logoItem.enabled = NO;2.添加顶部item
XMGTopView *topView = [XMGTopView topView];UIBarButtonItem *topViewItem = [[UIBarButtonItem alloc] initWithCustomView:topView];
self.navigationItem.leftBarButtonItems = @[logoItem,topViewItem];
}
美团界面搭建(类别的展示)
一.xib描述XMGTopItemView
pragma mark - 快速创建xib
-(instancetype)topItemView { return [[[NSBundle mainBundle] loadNibNamed:@"XMGTopItemView" owner:nil options:nil] firstObject]; }
pragma - mark - 修改属性内容
-(void)setTitle:(NSString *)title { self.titleLabel.text = title; }
-(void)setSubTitle:(NSString *)subTitle { self.subTitleLabel.text = subTitle; }
-(void)setIconWithimage:(NSString )image highImage:(NSString )highImage { [self.iconButton setImage:[UIImage imageNamed:image] forState:UIControlStateNormal]; [self.iconButton setImage:[UIImage imageNamed:highImage] forState:UIControlStateHighlighted]; }
pragma - mark 对外提供监听点击
(void)addTarget:(id)target action:(SEL)action { [self.iconButton addTarget:target action:action forControlEvents:UIControlEventTouchUpInside]; } ```
二.XMGHomeViewController
pragma mark - 懒加载
(XMGCategoryController *)categoryVC { if (categoryVC == nil) {
1.创建内容控制器 categoryVC = [[XMGCategoryController alloc] init];
2.设置弹出样式 _categoryVC.modalPresentationStyle = UIModalPresentationPopover;
} return _categoryVC; }
(void)categoryClick { 1.弹出位置 self.categoryVC.popoverPresentationController.barButtonItem = self.categoryItem;
2.以modal形式弹出
[self presentViewController:_categoryVC animated:YES completion:nil]; }
三.XMGLRTableView 快速创建
-(instancetype)lrTableView { return [[[NSBundle mainBundle] loadNibNamed:@"XMGLRTableView" owner:nil options:nil] firstObject]; }
pragma mark - tableview数据
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { if (tableView == self.leftTableView) { 左边的tableView return self.categoryData.count; } else { 右边的tableView return self.subCategoryData.count; }
}
-(UITableViewCell )tableView:(UITableView )tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell cell = nil; if (tableView == self.leftTableView) { 左边的tableView cell = [XMGLeftCell leftCellWithTabelView:tableView]; 取出模型 XMGCategory category = self.categoryData[indexPath.row]; cell.textLabel.text = category.name; cell.imageView.image = [UIImage imageNamed:category.small_icon]; cell.imageView.highlightedImage = [UIImage imageNamed:category.small_highlighted_icon]; } else { 右边的tableView
cell = [XMGRightCell rightCellWithTabelView:tableView];
cell.textLabel.text = self.subCategoryData[indexPath.row];
} return cell; }
pragma mark - 代理
-(void)tableView:(UITableView )tableView didSelectRowAtIndexPath:(NSIndexPath )indexPath { if (tableView == self.leftTableView) { 左边的tableView
1.取出模型 XMGCategory *category = self.categoryData[indexPath.row];
2.记录数据 self.subCategoryData = category.subcategories; 3.刷新游标表格 [self.rightTableView reloadData];
} else { 右边的tableView
} }
- 四.XMGCategoryController
-
(void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];1.添加左右tableView XMGLRTableView *lrTabelView = [XMGLRTableView lrTableView]; lrTabelView.categoryData = [XMGCategory objectArrayWithFilename: @"categories.plist"]; lrTabelView.frame = self.view.bounds; 2.随父控件的拉伸而拉伸 lrTabelView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth; [self.view addSubview:lrTabelView];
}
- (NSArray *)categoryData {
if (!_categoryData) {
_categoryData = [XMGCategory objectArrayWithFile:@"categories.plist"];
}
return _categoryData;
}
- (NSArray *)categoryData {
封装LRTableView
- 一.XMGLRTableView
1.自定义协议以及代理
@class XMGLRTableView;
@protocol XMGLRTableViewDataSource <NSObject>
@required
/** 左边返回多少行 */
- (NSInteger)numOfLeftRowsWithLRTableView:(XMGLRTableView )lrTableView;
/* 左边第几行返回的文字 */ - (NSString )lrTableView:(XMGLRTableView )lrTableView titleInRow:(NSInteger)row;
/ 左边第几行返回的右边的子数据 */ - (NSArray )lrTableView:(XMGLRTableView )lrTableView subDataInRow:(NSInteger)row;
@optional
/ 返回普通图片 */ - (NSString )lrTableView:(XMGLRTableView )lrTableView imageInRow:(NSInteger)row;
/ 返回选中图片 */ - (NSString *)lrTableView:(XMGLRTableView *)lrTableView highImageInRow:(NSInteger)row;
@end
@protocol XMGLRTableViewDelegate <NSObject>
@optional
/** 点击左边,告知点击的行数 */
- (void)lrTableView:(XMGLRTableView )lrTableView seletedLeftRow:(NSInteger)leftRow;
/* 点击左边,告知点击的左右行数 */ - (void)lrTableView:(XMGLRTableView *)lrTableView seletedLeftRow:(NSInteger)leftRow seletedRightRow:(NSInteger)rightRow;
@end
- 一.1 调用协议与代理
pragma mark - tableview数据源
(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
if (tableView == self.leftTableView) { 左边的tableView
return [self.dataSource numOfLeftRowsWithLRTableView:self];
} else { 右边的tableView
return self.subData.count;
}
}-
(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = nil;
if (tableView == self.leftTableView) { 左边的tableView
cell = [XMGLeftCell leftCellWithTabelView:tableView];
左边的文字
cell.textLabel.text = [self.dataSource lrTableView:self titleInRow:indexPath.row];
左边的图片,可实现
if ([self.dataSource respondsToSelector:@selector(lrTableView:imageInRow:)]) {
cell.imageView.image = [UIImage imageNamed:[self.dataSource lrTableView:self imageInRow:indexPath.row]];
}if ([self.dataSource respondsToSelector:@selector(lrTableView:highImageInRow:)]) { cell.imageView.highlightedImage =[UIImage imageNamed:[self.dataSource lrTableView:self highImageInRow:indexPath.row]]; }
} else { 右边的tableView
cell = [XMGRightCell rightCellWithTabelView:tableView]; cell.textLabel.text = self.subData[indexPath.row];
}
return cell;
}
pragma mark - tableview代理
-
(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
if (tableView == self.leftTableView) { 左边的tableView
1.获取子数据
self.subData = [self.dataSource lrTableView:self subDataInRow:indexPath.row];2.刷新右边表格 [self.rightTableView reloadData]; 3.通知代理被点了 if ([self.delegate respondsToSelector:@selector(lrTableView:seletedLeftRow:)]) { [self.delegate lrTableView:self seletedLeftRow:indexPath.row]; } 4.记录行数 self.seleteLeftRow = indexPath.row;
} else { 右边的tableView
通知代理被点了
if ([self.delegate respondsToSelector:@selector(lrTableView:seletedLeftRow:seletedRightRow:)]) {
[self.delegate lrTableView:self seletedLeftRow:self.seleteLeftRow seletedRightRow:indexPath.row];
}}
} 二.实现协议与代理XMGCategoryController
pragma mark - 实现XMGLRTableView数据源方法(NSInteger)numOfLeftRowsWithLRTableView:(XMGLRTableView *)lrTableView {
return self.categoryData.count;
}(NSString *)lrTableView:(XMGLRTableView *)lrTableView titleInRow:(NSInteger)row {
XMGCategory *category = self.categoryData[row];
return category.name;
}(NSArray *)lrTableView:(XMGLRTableView *)lrTableView subDataInRow:(NSInteger)row {
XMGCategory *category = self.categoryData[row];
return category.subcategories;
}(NSString *)lrTableView:(XMGLRTableView *)lrTableView imageInRow:(NSInteger)row {
XMGCategory *category = self.categoryData[row];
return category.small_icon;
}(NSString *)lrTableView:(XMGLRTableView *)lrTableView highImageInRow:(NSInteger)row {
XMGCategory *category = self.categoryData[row];
return category.small_highlighted_icon;
}
pragma mark - 实现XMGLRTableView代理
(void)lrTableView:(XMGLRTableView *)lrTableView seletedLeftRow:(NSInteger)leftRow {
1.获取数据
XMGCategory *category = self.categoryData[leftRow];
if (category.subcategories.count == 0) { 当没有子数据的时候发送通知
2.发送通知
NSDictionary *userInfo = @{XMGCategoryNotificationKey : category};
[[NSNotificationCenter defaultCenter] postNotificationName:XMGCategoryNotification object:nil userInfo:userInfo];
}
}(void)lrTableView:(XMGLRTableView *)lrTableView seletedLeftRow:(NSInteger)leftRow seletedRightRow:(NSInteger)rightRow {
1.获取数据
XMGCategory *category = self.categoryData[leftRow];
NSString *subCategory = category.subcategories[rightRow];
2.发送通知
NSDictionary *categoryUserInfo = @{XMGCategoryNotificationKey : category,
XMGSubCategoryNotificationKey : subCategory};
[[NSNotificationCenter defaultCenter] postNotificationName:XMGCategoryNotification object:nil userInfo:categoryUserInfo];
}三.接收通知改变内容
pragma mark - 监听通知
- (void)setupNotifications {
1.类别通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(categoryChange:) name:XMGCategoryNotification object:nil];
2.区域通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(regionChange:) name:XMGRegionNotification object:nil];
}
pragma mark - 类别发生改变
-
(void)categoryChange:(NSNotification *)noti {
1.从字典中取出数据
XMGCategory *category = noti.userInfo[XMGCategoryNotificationKey];
NSString *subCategory = noti.userInfo[XMGSubCategoryNotificationKey];2.设置标题和子标题显示
2.1 获取itemView
XMGTopItemView *topItemView = self.categoryItem.customView;
if (!category.subcategories) { 没有子类别
[topItemView setTitle:@"美团"];
[topItemView setSubTitle:category.name];
} else { 有子类别
[topItemView setTitle:category.name];
[topItemView setSubTitle:subCategory];
}设置图片
[topItemView setIconWithimage:category.icon highImage:category.highlighted_icon];关闭popver
[self.categoryVC dismissViewControllerAnimated:YES completion:nil];设置可交互
[self barButtonEnabled];
}
pragma mark - 区域发生改变
-
(void)regionChange:(NSNotification *)noti {
1.从字典中取出数据
XMGRegion *region = noti.userInfo[XMGRegionNotificationKey];
NSString *subRegion = noti.userInfo[XMGSubRegionNotificationKey];2.设置标题和子标题显示
2.1 获取itemView
XMGTopItemView *topItemView = self.regionItem.customView;
if (!region.subregions) { 没有子类别
[topItemView setTitle:@"广州"];
[topItemView setSubTitle:@"全部区域"];
} else { 有子类别
[topItemView setTitle:region.name];
[topItemView setSubTitle:subRegion];
}3.弹出popVer
[self.regionVC dismissViewControllerAnimated:YES completion:nil];4.设置可交互
[self barButtonEnabled];
}
排序的Popover和item点击的bug
- 一 XMGSortController
-
(void)viewDidLoad {
[super viewDidLoad];1.设置背景颜色
self.view.backgroundColor = [UIColor whiteColor];2.设置内容
CGFloat width = 120;
CGFloat height = 40;
CGFloat left = 20;
CGFloat topMargin = 10;
for (int i = 0; i < self.sorts.count; i++) {
XMGSort *sort = self.sorts[i];
UIButton sortBtn = [[UIButton alloc] init];
sortBtn.tag = i;
[sortBtn setTitle:sort.label forState:UIControlStateNormal];
[sortBtn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[sortBtn setBackgroundImage:[UIImage imageNamed:@"btn_filter_normal"] forState:UIControlStateNormal];
[sortBtn setBackgroundImage:[UIImage imageNamed:@"btn_filter_selected"] forState:UIControlStateSelected];
[sortBtn addTarget: self action:@selector(sortBtnClick:) forControlEvents:UIControlEventTouchUpInside];
sortBtn.frame = CGRectMake(left, (height+topMargin)i + topMargin, width, height);
[self.view addSubview:sortBtn];
}3.设置内容控制器的size
self.preferredContentSize = CGSizeMake(width + 2left, self.sorts.count(height+topMargin) + topMargin);
} -
(void)sortBtnClick:(UIButton *)sortBtn {
1.切换选中状态
self.seletedBtn.selected = NO;
self.seletedBtn = sortBtn;
self.seletedBtn.selected = YES;2.发送通知
XMGSort *sort = self.sorts[sortBtn.tag];
NSDictionary *userInfo = @{XMGSortNotificationKey : sort};
[[NSNotificationCenter defaultCenter] postNotificationName:XMGSortNotification object:nil userInfo:userInfo];
}
pragma mark - 懒加载
(NSArray *)sorts {
if (_sorts == nil) {
self.sorts = [XMGSort objectArrayWithFilename:@"sorts.plist"];
}
return _sorts;
}二.
-
(void)sortChange:(NSNotification *)noti {
1.从字典中取出数据
XMGSort *sort = noti.userInfo[XMGSortNotificationKey];2.更改标题
2.1获取itemView
XMGTopItemView *itemView = self.sortItem.customView;
[itemView setSubTitle:sort.label];3.退出popVer
[self.sortVC dismissViewControllerAnimated:YES completion:nil];4.设置可交互
[self barButtonEnabled];
}
UISplitViewController
- 一MenuViewController
pragma mark - tableView datasource
(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return self.foodTypes.count;
}-
(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *ID = @"cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID];
}1.取出模型
FoodType *ft = self.foodTypes[indexPath.row];
2.给cell设置数据
cell.textLabel.text = ft.name;
return cell;
}
pragma mark - tableView delegate
-
(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
1.取出模型
FoodType *ft = self.foodTypes[indexPath.row];2.发送通知
NSDictionary *userInfo = @{menuDidChangeNotificationKey : ft};
[[NSNotificationCenter defaultCenter] postNotificationName:menuDidChangeNotification object:nil userInfo:userInfo];
}
pragma mark - 懒加载
(NSArray *)foodTypes {
if (_foodTypes == nil) {
_foodTypes = [FoodType objectArrayWithFilename:@"food_types.plist"];
}
return _foodTypes;
}二 DetailViewController
-
(void)viewDidLoad {
[super viewDidLoad];1.设置高度
self.tableView.rowHeight = 80;2.接收通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(menuChange:) name:menuDidChangeNotification object:nil];
}
pragma mark - 接收通知刷新表格
- (void)menuChange:(NSNotification *)noti {
1.从字典中取模型
FoodType *ft = noti.userInfo[menuDidChangeNotificationKey];
2.加载对应的plist
self.foods = [Food objectArrayWithFilename:[NSString stringWithFormat:@"type_%@_foods.plist",ft.idstr]];
3.刷新数据源
[self.tableView reloadData];
4.改变title
self.title = ft.name;
}
pragma mark - Table view data source
(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return self.foods.count;
}-
(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *ID = @"cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];
}1.取出模型
Food *fd = self.foods[indexPath.row];2.设置数据
cell.textLabel.text = fd.name;
cell.detailTextLabel.text = [NSString stringWithFormat:@"时间:%@ 难度%@",fd.time,fd.diff];return cell;
}
pragma mark - Table view delegate
-
(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
1.获取模型数据
Food *fd = self.foods[indexPath.row];2.弹出控制器
RecipeViewController *recipeVC = [[RecipeViewController alloc] init];
recipeVC.fd = fd;
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:recipeVC];
nav.modalPresentationStyle = UIModalPresentationFormSheet;
[self presentViewController:nav animated:YES completion:nil];
}
pragma mark - 移除通知
(void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
}三 RecipeViewController
(void)loadView {
更改控制器的View
UIWebView *webView = [[UIWebView alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.view = webView;
self.webView = webView;
}-
(void)viewDidLoad {
[super viewDidLoad];1.设置导航条左侧内容
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"关闭" style:UIBarButtonItemStyleDone target:self action:@selector(exit)];2.设置标题
self.title = self.fd.name;3.webView展示信息
NSString *urlString = [NSString stringWithFormat:@"Html/food/%@.html", self.fd.idstr];
NSURL *url = [[NSBundle mainBundle] URLForResource:urlString withExtension:nil];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[self.webView loadRequest:request];
}
- (void)exit {
[self dismissViewControllerAnimated:YES completion:nil];
}