以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)的更多相关文章

  1. 搭建QQ聊天通信的程序:(1)基于 networkcomms.net 创建一个WPF聊天客户端服务器应用程序 (1)

    搭建QQ聊天通信的程序:(1)基于 networkcomms.net 创建一个WPF聊天客户端服务器应用程序 原文地址(英文):http://www.networkcomms.net/creating ...

  2. 【翻译】使用Sencha Touch创建基于Tizen应用程序

    原文:Building a Tizen App With Sencha Touch 作者:Gautam Agrawal Gautam Agrawal is Sencha's Sr. Product M ...

  3. 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.文件读取.可变参数.自动滚动 之前的介 ...

  4. Creating Dialogbased Windows Application (3) / 创建基于对话框的Windows应用程序(三)Checkbox的应用、窗体置顶、设置图标 / VC++, Windows

    创建基于对话框的Windows应用程序(三) —— Checkbox的应用.窗体置顶.设置图标 上一节创建的窗体应用程序中,我们用到了Button和StaticText这两个控件.这一节中我们将学习使 ...

  5. Creating Dialogbased Windows Application (2) / 创建基于对话框的Windows应用程序(二)Button的应用、新建子窗体 / VC++, Windows

    创建基于对话框的Windows应用程序(二) —— Button的应用.新建子窗体 可以发现上一节创建的窗体中,点击OK和Cancel两个按钮是没有任何反应的.现在我们来为他们添加退出对话框的功能. ...

  6. Creating Dialogbased Windows Application (1) / 创建基于对话框的Windows应用程序(一)新建窗体 / VC++, Windows

    创建基于对话框的Windows应用程序(一) —— 新建窗体 1.新建一个Visual C++的Empty Project.  2.在Solution Explorer中右键Add New Item, ...

  7. 基于 SailingEase WinForm Framework 开发客户端程序(3:实现菜单/工具栏按钮的解耦及状态控制)

    本系列文章将详细阐述客户端应用程序的设计理念,实现方法. 本系列文章以  SailingEase WinForm Framework 为基础进行设计并实现,但其中的设计理念及方法,亦适用于任何类型的客 ...

  8. 实验一:基于Winsock完成简单的网络程序开发

    第一部分:简答的UDP网络通信程序 // UDP5555.cpp : Defines the entry point for the application. //================== ...

  9. DevExpress XtraReports 入门三 创建 Master-Detail(主/从) 报表

    原文:DevExpress XtraReports 入门三 创建 Master-Detail(主/从) 报表 本文只是为了帮助初次接触或是需要DevExpress XtraReports报表的人群使用 ...

随机推荐

  1. JAVA多线程提高三:线程范围内共享变量&ThreadLocal

    今天我们学习的是如何在线程自己的范围内达到变量数据的共享,而各个线程之间又是互相独立开来,各自维护的,即我们说的ThreadLocal的作用. 一.概念 可以将每个线程用到的数据与对应的线程号存放到一 ...

  2. [php]手动搭建php开发环境(排错)

    前提:针对自己的系统下载相应的php.apache.mysql,安装完毕后按照以下去配置httpd.conf和php.ini 本人用的是php5.6.4和apache2.4.4 一.Apache : ...

  3. 【CF343D】 Water Tree(树链剖分)

    题目链接 树剖傻逼题,练练手好久没写树剖了. 查询忘记\(pushdown\)抓了好久虫.. 全文手写,一遍过... #include <cstdio> const int MAXN = ...

  4. node、npm及node_modules中依赖的版本更新

    好久没用node了,想重新拾起来发现node还有相关模块的版本都太低了,使用npm install全是报版本低的警告. 这里记录一下,版本管理和node_modules更新的方法. 我用的是Windo ...

  5. Double类型的数向上取整和向下取整

  6. SQLite3 C/C++ 开发接口简介(API函数)

    from : http://www.sqlite.com.cn/MySqlite/5/251.Html 1.0 总览 SQLite3是SQLite一个全新的版本,它虽然是在SQLite 2.8.13的 ...

  7. Mysql 中 char 、varchar 、text的区别

    首先它们的存储方式和数据的检索方式都不一样.数据的检索效率是:char > varchar > text 空间占用方面,就要具体情况具体分析了. char:存储定长数据很方便,CHAR字段 ...

  8. google浏览器中,使用clockwork 来调试

    参考:https://laravel-china.org/courses/laravel-package/1976/debugging-tool-under-chrome-itsgoingdclock ...

  9. 欧拉回路&欧拉通路判断

    欧拉回路:图G,若存在一条路,经过G中每条边有且仅有一次,称这条路为欧拉路,如果存在一条回路经过G每条边有且仅有一次, 称这条回路为欧拉回路.具有欧拉回路的图成为欧拉图. 判断欧拉通路是否存在的方法 ...

  10. virtualenv python的虚拟环境

    官网:https://virtualenv.pypa.io/en/stable/userguide/ virtualenv通过创建独立Python开发环境的工具, 来解决依赖.版本问题 基本使用: d ...