当前位置: 首页 > news >正文

创建基于主-从视图的应用程序(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的数据对象后,将该对象传给详细信息场景。可能的代码如下:

<span style="font-size:18px;">- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    self.detailViewController.detailItem = [[flowerData objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];
}</span>
step3是当详细信息场景加载后,通过一个名为configureView的方法,来获取step2设置的detailItem,并做相应处理。可能的代码如下:

<span style="font-size:18px;">- (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;
    }
}</span>

一般做到上面三步,应用程序在iPad上就能正常运行了;但其iPhone版存在一个小问题,就是在用户点击Cell时,并不能直接获取详细信息场景的对象,可以用下面的代码验证:

<span style="font-size:18px;">- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if(self.detailViewController)
    {
        NSLog(@"i got it");
    }
    else
    {
        NSLog(@"bad luck,it's nil");
    }
}</span>

在iPhone下self.detailViewController得到的是一个nil,而在iPad下可以正确获取到对象,这是因为iPad是由分割视图控制器管理,可以轻松访问另一个场景的视图控制器。要修复这种问题,在iPhone中需要先在prepareForSegue:sender:方法中设置self.detailViewController的值:

<span style="font-size:18px;">- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    self.detailViewController = segue.destinationViewController;
}</span>
当这样设置以后,应用程序在iPad和iPhone上就都能正常运行了。总的来说,基于Master-Detail Application来创建项目还是比较简单的,只需要注意iPhone版会遇到的两个问题就OK了(1. 改表视图的Content导致的连接丢失;2. self.detailViewController为nil)。


转载自:http://www.cnblogs.com/wayne23/p/3596818.html


相关文章:

  • Hibernate对视图的映射
  • Hibernate的generator属性
  • ognl.ExpressionSyntaxException: Malformed OGNL expression
  • jquery-1.11.1.min.js与jquery.min.js有红色的叉号
  • 火狐中的firebug学习
  • jQuery EasyUI中的datagrid无法显示json数据
  • java中session对象及其常用方法
  • 从Hibernate中获得JDBC连接
  • iOS学习之UIActionSheet的使用
  • Android HOME键那些事
  • 在非activity的类中调用startActivity(intent)
  • iOS中#import和@class的区别
  • Android开机自动启动程序设置 .
  • varchar与nvarchar的区别
  • Android中的资源文件
  • ----------
  • 时间复杂度分析经典问题——最大子序列和
  • #Java异常处理
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • Apache的基本使用
  • Consul Config 使用Git做版本控制的实现
  • docker容器内的网络抓包
  • HTTP那些事
  • Java Agent 学习笔记
  • JavaScript对象详解
  • Java超时控制的实现
  • markdown编辑器简评
  • Octave 入门
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • 爱情 北京女病人
  • 安装python包到指定虚拟环境
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 通信类
  • 我这样减少了26.5M Java内存!
  • 小程序button引导用户授权
  • 【干货分享】dos命令大全
  • 选择阿里云数据库HBase版十大理由
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • #QT项目实战(天气预报)
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • (转载)深入super,看Python如何解决钻石继承难题
  • .NET Micro Framework 4.2 beta 源码探析
  • .NET/ASP.NETMVC 大型站点架构设计—迁移Model元数据设置项(自定义元数据提供程序)...
  • .Net接口调试与案例
  • .NET中 MVC 工厂模式浅析
  • .Net组件程序设计之线程、并发管理(一)
  • @EnableConfigurationProperties注解使用
  • @SuppressWarnings(unchecked)代码的作用
  • [ C++ ] STL_stack(栈)queue(队列)使用及其重要接口模拟实现