创建基于主-从视图的应用程序(Master-Detail Application)
以Master-Detail Application创建的应用程序在iPad和iPhone上都能运行,虽然模板解决了大部分问题,但还是有一些Apple遗留问题需要解决。使用该模板创建项目时,需要将下拉列表Device Family设置为Universal,且不要选择复选框Use Core Data。
项目默认就包含两个故事板,一个用于iPhone(MainStoryboard_iPhone.storyboard),另一个用于iPad(MainStoryboard_iPad.storyboard)。
打开MainStoryboard_iPad_storyboard,可以看到一个分割视图控制器连接到两个导航控制器(UINavigationController)。主导航控制器连接到一个包含表视图(UITableView)的场景,这是主场景,由MasterViewController类处理;详细信息导航控制器连接到一个简单的空场景(UIViewController),由DetailViewController类处理。
MainStoryboard_iPhone.storyboard就简单许多,一个导航控制器(UINavigationController)连接到两个场景。第一个是主场景(MasterViewController),第二个是详细信息场景(DetailViewController)。
需要注意的一个细节是:在iPhone故事板下,如果你修改主场景里的UITableView,将Content由默认的值Static Cells改为Dynamic Prototypes,修改完成后会丢失主场景到详细信息场景的连接。要修复该连接,需要按住Control键,并从单元格(不是表)拖曳到详细信息场景,并在Xcode提示时选择Push。
无论是iPhone还是iPad故事板,基本的流程是一样的:
step 1: 主场景包含一个UITableView,并加载数据。
step 2: 点击某一个Cell,将Cell包含的数据对象传递给详细信息场景,并跳转或加载详细信息场景。
step 3: 详细信息场景加载后,根据接收到的Cell数据对象做相应的初始化工作。
对于step1,主要还是实现表视图的数据源协议(UITableViewDataSource)要求的主要方法,这一步和以前单独实现表视图的方法完全一致。
step2主要处理表视图的委托协议(UITableViewDelegate)的tableView:didSelectRowAtIndexPath:方法。当收集到Cell的数据对象后,将该对象传给详细信息场景。可能的代码如下:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
self.detailViewController.detailItem = [[flowerData objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];
}
step3是当详细信息场景加载后,通过一个名为configureView的方法,来获取step2设置的detailItem,并做相应处理。可能的代码如下:
- (void)configureView
{
// Update the user interface for the detail item. if (self.detailItem)
{
NSDictionary *dict = self.detailItem; self.navigationItem.title = [dict objectForKey:@"name"]; NSURL *url = [NSURL URLWithString:[dict objectForKey:@"url"]];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[self.detailWebView loadRequest:request]; self.detailDescriptionLabel.hidden = YES;
}
}
一般做到上面三步,应用程序在iPad上就能正常运行了;但其iPhone版存在一个小问题,就是在用户点击Cell时,并不能直接获取详细信息场景的对象,可以用下面的代码验证:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if(self.detailViewController)
{
NSLog(@"i got it");
}
else
{
NSLog(@"bad luck,it's nil");
}
}
在iPhone下self.detailViewController得到的是一个nil,而在iPad下可以正确获取到对象,这是因为iPad是由分割视图控制器管理,可以轻松访问另一个场景的视图控制器。要修复这种问题,在iPhone中需要先在prepareForSegue:sender:方法中设置self.detailViewController的值:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
self.detailViewController = segue.destinationViewController;
}
当这样设置以后,应用程序在iPad和iPhone上就都能正常运行了。总的来说,基于Master-Detail Application来创建项目还是比较简单的,只需要注意iPhone版会遇到的两个问题就OK了(1. 改表视图的Content导致的连接丢失;2. self.detailViewController为nil)。
创建基于主-从视图的应用程序(Master-Detail Application)的更多相关文章
- 搭建QQ聊天通信的程序:(1)基于 networkcomms.net 创建一个WPF聊天客户端服务器应用程序 (1)
搭建QQ聊天通信的程序:(1)基于 networkcomms.net 创建一个WPF聊天客户端服务器应用程序 原文地址(英文):http://www.networkcomms.net/creating ...
- 【翻译】使用Sencha Touch创建基于Tizen应用程序
原文:Building a Tizen App With Sencha Touch 作者:Gautam Agrawal Gautam Agrawal is Sencha's Sr. Product M ...
- Creating Dialogbased Windows Application (4) / 创建基于对话框的Windows应用程序(四)Edit Control、Combo Box的应用、Unicode转ANSI、Open File Dialog、文件读取、可变参数、文本框自动滚动 / VC++, Windows
创建基于对话框的Windows应用程序(四)—— Edit Control.Combo Box的应用.Unicode转ANSI.Open File Dialog.文件读取.可变参数.自动滚动 之前的介 ...
- Creating Dialogbased Windows Application (3) / 创建基于对话框的Windows应用程序(三)Checkbox的应用、窗体置顶、设置图标 / VC++, Windows
创建基于对话框的Windows应用程序(三) —— Checkbox的应用.窗体置顶.设置图标 上一节创建的窗体应用程序中,我们用到了Button和StaticText这两个控件.这一节中我们将学习使 ...
- Creating Dialogbased Windows Application (2) / 创建基于对话框的Windows应用程序(二)Button的应用、新建子窗体 / VC++, Windows
创建基于对话框的Windows应用程序(二) —— Button的应用.新建子窗体 可以发现上一节创建的窗体中,点击OK和Cancel两个按钮是没有任何反应的.现在我们来为他们添加退出对话框的功能. ...
- Creating Dialogbased Windows Application (1) / 创建基于对话框的Windows应用程序(一)新建窗体 / VC++, Windows
创建基于对话框的Windows应用程序(一) —— 新建窗体 1.新建一个Visual C++的Empty Project. 2.在Solution Explorer中右键Add New Item, ...
- 基于 SailingEase WinForm Framework 开发客户端程序(3:实现菜单/工具栏按钮的解耦及状态控制)
本系列文章将详细阐述客户端应用程序的设计理念,实现方法. 本系列文章以 SailingEase WinForm Framework 为基础进行设计并实现,但其中的设计理念及方法,亦适用于任何类型的客 ...
- 实验一:基于Winsock完成简单的网络程序开发
第一部分:简答的UDP网络通信程序 // UDP5555.cpp : Defines the entry point for the application. //================== ...
- DevExpress XtraReports 入门三 创建 Master-Detail(主/从) 报表
原文:DevExpress XtraReports 入门三 创建 Master-Detail(主/从) 报表 本文只是为了帮助初次接触或是需要DevExpress XtraReports报表的人群使用 ...
随机推荐
- 使用FormData提交表单及上传文件
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head ...
- ⑥ 设计模式的艺术-06.建造者(Builder)模式
场景 我们要建造一个复杂的产品.比如:神州飞船,Iphone.这个复杂的产品的创建.有这样一个问题需要处理: 装配这些子组件是不是有个步骤问题? 实际开发中,我们所需要的对象构建时,也非常复杂,有很多 ...
- 数组与集合List的相互转化
数组转化为集合 #此运用的是Arrays中的asList方法,返回一个List集合 *当数组元素为基本数据类型是把整个数组当作一个元素放入List集合中,代码举例: ,,}; List<int[ ...
- LintCode 539: Move Zeroes
终于下决心开始刷题了! 选择LintCode而不是LeetCode主要是因为LintCode操作更顺手,希望能够坚持下去. 还是循序渐进吧,数据结构和算法的东西很久没碰都很生疏了,先找找感觉. 这是一 ...
- 下载Google My Tracks
http://code.google.com/p/mytracks/source/browse/?name=2.0.2#hg%2FMyTracks%253Fstate%253Dclosed 需要类似的 ...
- JavaScript:自动生成博文目录导航
感谢 孤傲苍狼 分享了 自动生成博文目录的方法,本文仅作存档使用. 图 1:效果预览 CSS 样式 #TOCbar{ font-size:12px; text-align:left; position ...
- 【leetcode 简单】第三十九题 Excel表列名称
给定一个正整数,返回它在 Excel 表中相对应的列名称. 例如, 1 -> A 2 -> B 3 -> C ... 26 -> Z 27 -> AA 28 -> ...
- HDU 1072 Nightmare (广搜)
题目链接 Problem Description Ignatius had a nightmare last night. He found himself in a labyrinth with a ...
- python 实现字符串转整型
def str2Int(s): l=list(s) if len(l)<=0: return 0 flag=0 sum=0 dict_num={':9} dict_tag={'+':1,'-': ...
- kippo蜜罐搭建
kippo蜜罐搭建 总结一下kippo蜜罐搭建的方法,centos系统.kippo-master.zip的安装包 (gcc,python-devel,pip,twisted==13.10,pycryp ...