iPad开发--美团界面的搭建(主要是对Popover的使用,以及监听)
一.主界面的搭建,效果图.设置self.navigationItem.leftBarButtonItems属性.
- 由于leftBarButtonItem是通过xib文件创建的,通过xib创建的控件默认跟随父控件的大小而变化

- 解决方法:取消xib的autoLayout,取消xib的高度自动拉伸和宽度自动拉伸

- 自定义的控件需要外界来更改显示的图片以及文字,所以对外提供以下方法来设置自己显示的图片以及文字

二.leftBarButtonItem点击后是通过Popover来展示的,而且展示的都是一个具有两个TableView的级联菜单,这里自定义了级联菜单的View(下面都叫做LRTableView),用的时候将自定义控件添加到对应的控制器上.但是LRTableView需要被提供数据才能显示想要的内容.
- 解决方法一:对外提供一个将要显示的模型数据,这种方法导致了LRTableView太依赖模型属性,如果模型属性太多的话不仅要判断传过来的是什么模型,而且还不好控制
- 解决方法二:模仿苹果的TableView,给自己的LRTableView也写一个数据源,写一个代理(这里用的这种),LRTableView需要数据的时候就不用依赖模型属性了,直接问数据源要数据.
数据源协议:

代理协议:

- LRTableView内部需要数据的时候直接调用数据源的方法即可
#pragma mark - UITableViewDataSource
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
if (tableView == self.leftTableView) { // 左边的表格
// 通过数据源获得行数
return [self.dataSource numberOfRowsInLRViewWithLRView:self];
} else { // 右边的表格
return self.subCategories.count;
}
} - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = nil;
if (tableView == self.leftTableView) { // 左边的表格
// 创建左边的cell
cell = [ChaosLeftCell leftCellWithTableView:tableView];
// 通过数据源获得对应行的name
cell.textLabel.text = [self.dataSource lrView:self leftTitleInRow:indexPath.row];
// 通过数据源设置图片
if ([self.dataSource respondsToSelector:@selector(lrView:imageNameForRow:)]) { NSString *imageName = [self.dataSource lrView:self imageNameForRow:indexPath.row];
cell.imageView.image = [UIImage imageNamed:imageName];
}
// 通过数据源设置高亮图片
if ([self.dataSource respondsToSelector:@selector(lrView:highlightImageNameForRow:)]) { NSString *highlightImage = [self.dataSource lrView:self highlightImageNameForRow:indexPath.row];
cell.imageView.highlightedImage = [UIImage imageNamed:highlightImage];
} } else { // 右边的表格
// 创建右边的cell
cell = [ChaosRightCell rightCellWithTableView:tableView]; cell.textLabel.text = self.subCategories[indexPath.row];
}
return cell;
} #pragma mark - UITableViewDelegate
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if (tableView == self.leftTableView) { // 左边的表格
// 取出子数据,并保存
self.subCategories = [self.dataSource lrView:self subDataOfLeftRow:indexPath.row];
// 刷新数据
[self.rightTableView reloadData];
// 点击了左边
if ([self.delegate respondsToSelector:@selector(lrView:didSelectedLeftRow:)]) {
[self.delegate lrView:self didSelectedLeftRow:indexPath.row];
}
} else { // 右边的表格 if ([self.delegate respondsToSelector:@selector(lrView:didSelectedRightRow:andLeftRow:)]) {
[self.delegate lrView:self didSelectedRightRow:indexPath.row andLeftRow:[self.leftTableView indexPathForSelectedRow].row];
}
}
} - 相应的控制器实现LRTableView的数据源方法

- 实现代理方法,点击LRTableView中的cell发出通知,接受到通知的view或控制器要修改BarButtonItem的文字和图片

- NavigationController的栈顶控制器监听LRTableView被点击发出的通知,根据传过来的模型数据,重新设置自定义BarButtonItem的文字或者图片.最后记得移除通知

iPad开发--美团界面的搭建(主要是对Popover的使用,以及监听)的更多相关文章
- 1-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案安全篇(来看一下怎么样监听网络数据,监听电脑上位机软件的数据)
首先安装网络监听软件 运行这个软件 这个软件安装到电脑上,默认是监听咱电脑上的网络通信 咱们先监听电脑的软件的网络通信数据,然后再说怎么监听Wi-Fi和APP的软件的网络通信数据 咱就监听咱基础篇的 ...
- 使用Jmeter创建ActiveMQ JMS POINT TO POINT请求,环境搭建、请求创建、插件安装、监听服务器资源等
转自:http://www.cnblogs.com/qianyiliushang/p/4348584.html 准备工作: 安装JDK,推荐使用1.7以上版本,并设置JAVA_HOME 下载Jmete ...
- 转: 使用Jmeter创建ActiveMQ JMS POINT TO POINT请求,环境搭建、请求创建、插件安装、监听服务器资源等
转自:http://www.cnblogs.com/qianyiliushang/p/4348584.html 准备工作: 安装JDK,推荐使用1.7以上版本,并设置JAVA_HOME 下载Jmete ...
- Android开发 ---基本UI组件7 :分页功能、适配器、滚动条监听事件
效果图: 1.activity_main.xml 描述: 定义了一个按钮 <?xml version="1.0" encoding="utf-8"?> ...
- 使用Kotlin开发Android应用 - 环境搭建 (1)
一. 在Android Studio上安装Kotlin插件 按快捷键Command+, -> 在Preferences界面找到Plugins -> 点击Browse repositorie ...
- 【Android】Android实现监听返回键,主键(HOME),菜单键
目录结构: contents structure [+] 简介 监听 返回键 监听 主键(Home键) 监听 菜单键 一.简介 本篇文章介绍如何在Android中实现监听返回键,主键,菜单键.一般情况 ...
- 2-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案安全篇(监听Wi-Fi和APP的数据)
1-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案安全篇(来看一下怎么样监听网络数据,监听电脑上位机软件的数据) 因为那个软件只能监听咱自己电脑上的数据,所以咱就用电 ...
- iPad开发(相对于iPhone开发时专有的API)
iPad开发 一.iPad开发简介 1.什么是iPad 一款苹果公司于2010年发布的平板电脑 定价介于苹果的智能手机iPhone和笔记本电脑产品之间 跟iPhone一样,搭载的是iOS操作系统 2. ...
- iPhone与iPad开发实战读书笔记
iPhone开发一些读书笔记 手机应用分类1.教育工具2.生活工具3.社交应用4.定位工具5.游戏6.报纸和杂志的阅读器7.移动办公应用8.财经工具9.手机购物应用10.风景区相关应用11.旅游相关的 ...
随机推荐
- 05章 OGNL
一.OGNL全称是Object Graph Navigation Language,即对象导航图语言 OGNL在框架中主要做两件事情:表达式语言和类型转换器 OGNL在框架中的作用以及数据的流入流出: ...
- Java面向对象一
一.面向过程的思想和面向对象的思想 面向对象和面向过程的思想有着本质上的区别, 作为面向对象的思维来说,当你拿到一个问题时,你分析这个问题不再是第一步先做什么,第二步再做什么,这是面向过程的思维,你应 ...
- [No000009]学习重要还是经营人脉重要?
大说数人的朋友圈都是这样的:雪中送炭的寥寥无几,锦上添花的大多数人连你自己都不认识,碰到倒霉的时候还能遇到落进下石的.人脉是很重要,可相对自身的学习来说,就没有想象中那么重要了. 有一次在北大讲座,遇 ...
- Windows 7 USB DVD Download Tool
1.下载.安装.运行Windows 7 USB DVD Download Tool: 百度官方下载 http://rj.baidu.com/soft/detail/20458.html 2.点击&qu ...
- Android之SDK、NDK、JNI和so文件
1. SDK Android SDK(AndroidSoftware Development Kit),即Android软件开发工具包,Android的SDK基于Java实现,这意味着基于An ...
- rstudio安装devtool出现“无法解析服务器的名称或地址”问题的解决
问题:直接使用CRAN的源出现如下错误 Warning in install.packages : InternetOpenUrl failed: '无法解析服务器的名称或地址'Warning in ...
- Json转换类库
20160605 简单的DaTable转Json private string DtConvertJson(DataTable dt , string modelName="") ...
- viewTemplate
今天发现maya的属性编辑器界面似乎可以用xml来写,放在 /文档/maya/20xx/prefs这样的地方 发现一个很牛的maya插件SOuP,其中把一些近年论文的算法也集成进去了,网站在这里: h ...
- Oracle中把一个DateTime的字符串转化成date类型。to_date('2016/12/8 18:55:43','yyyy/MM/dd hh24:mi:ss'),
Oracle中把一个DateTime或者该形态字符串转化成date类型. to_date('2016/12/8 18:55:43','yyyy/MM/dd hh24:mi:ss'), 或者: sele ...
- pullRefresh组件配置
mui.init({ pullRefresh:{ container: '#contanier', indicators:false, up:{ height:200, contentinit: '' ...