以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. ③ 设计模式的艺术-03.工厂方法(Factory Method)模式

    public interface Car { void run(); } public class Audi implements Car { @Override public void run() ...

  2. wepy 使用组件时一个注意事项。。。

    组件传值prop 必须使用指定引用地址的数据 如果像下面这样 取为空shop 中的phone ,后续获取数据或就算 shop中有phone元素 子组件也无法获取到修改后的值 <template& ...

  3. 2017ACM暑期多校联合训练 - Team 2 1001 HDU 6045 Is Derek lying? (模拟)

    题目链接 Problem Description Derek and Alfia are good friends.Derek is Chinese,and Alfia is Austrian.Thi ...

  4. favico.js笔记

    1. favicon.js是什么 一个js库可以使用徽标.图像.视频等来设置网页的favicon,即网页标题栏上的小图标. 2. 如何使用 2.1 使用徽标 basic demo: <!DOCT ...

  5. 关于parse_str变量覆盖分析

    这个漏洞有两个姿势.一个是不存在的时候一个是存在的时候. 经过测试该漏洞只在php5.2中存在,其余均不存在. 倘若在parse_str函数使用的代码上方未将其定义那么即存在变量覆盖漏洞否则不行. 还 ...

  6. Where can I check in?

    Where can I check in? 在哪儿办理登记手续?

  7. Redis—初探Redis

    一.什么是Redis? 学习Redis最好的是看官网了,下面是Redis的官网对Redis的介绍 可见,Redis是一个内存存储的数据结构服务器,可以用作数据库.缓存等.支持的数据结构也很丰富,有字符 ...

  8. Linux 编译 apr-util 时报错

    前言 Apache 2.4 以后的版本不再自带 APR 库(Apache Portable Runtime,Apache 可移植运行库),所以在安装 Apache 之前需要手动下载安装 APR 库. ...

  9. linux系统cpu使用100%的命令

    for i in `seq 1 $(cat /proc/cpuinfo |grep "physical id" |wc -l)`; do dd if=/dev/zero of=/d ...

  10. linux 端口设置结构体 struc

      目录(?)[-] 一 输入模式 三输出模式 四控制模式 六特殊的控制字符 字符 TIME和MIN值 通过shell访问终端模式 终端速度 其他函数 使用termios结构的密码程序   termi ...