读书频道 > 移动开发 > ios开发 > iPhone UIKit详解
3.2.2 使用UINavigationController实现多层画面跳转
2012-09-15 16:12:31     我来说两句 
收藏    我要投稿   

本文所属图书 > iPhone UIKit详解

UIKit框架是iPhone应用程序开发中最基本的框架,也是用得最多、最重要的框架。本书就是一本UIKit开发大全,包括UIKit框架中各种类、控件使用技巧的相关介绍。本书每个章节都配有详细的应用实例,方便读者对UIKit...  立即去当当网订购

iPhone4手机的自带应用程序中,既有使用UITabBarController来进行画面切换控制的,也有使用UINavigationController来实现多画面间的跳转的。例如iPod音乐播放界面就采用了UITabBarController来进行画面切换控制,而iPhone手机设置程序则采用了UINavigationController来实现多层次画面间的跳转,图3-4、图3-5是这两个程序部分画面的跳转示意图。

与UITabBarController实现画面并行切换形式不同,UINavigationController是实现画面多层次跳转,也是其最大的特征。如图3-5 所示,画面1-1可以跳转至其下一层的画面1-1-1以及画面1-1-2中。另外UINavigationController可以自动地记忆跳转所经过的路径,按照这些记录的路径信息,可以依次返回到上层画面中(即支持返回按钮)。

下面我们将上一节采用UITabBarController实现的画面切换程序,再一次改造成采用UINavigationController来实现画面的跳转程序。其中两个下一层的画面保持不变,在这之前我们还将追加一个主画面,主画面非常简单,只有一个iPhone表格视图组成,两个下层画面的名称依次显示在表格中,当单击任何一个名称时将会跳转到对应的下层画面中,整个应用程序的跳转示意图如图3-6所示。

要实现上述程序,首先要进行如下两处修改。

● 在HelloWorldAppDelegate.m中将基准ViewController由UITableViewController替
换为UINavigationController。

● 新追加主画面的TopMenuController类。

需要注意一点,这里我们对画面1以及画面2的实现代码其实是没有进行任何修改的。只是留下了些原实例中追加的关于UITabBarController的注释,请务必忽略。

下面我们看看HelloWorldAppDelegate.m的修改代码,见代码中的黑体字部分。

[Hello World AppDelegate.m]
#import "Hello World AppDelegate.h"
#import "To p M e nu Co nt r oller.h"
@i m ple m e nt at io n Hello W orld A p pD ele g ate
@sy nt h esize w i n d o w = w i n d o w _ ;
- (void)applicationDid FinishLau nching:(UIApplication *)application {
 
  // 初始化Wi n d o w 实例变量
  CG R e c t b ou n d s = [[UIScr e e n m a i nScr e e n] b ou n d s];
  w i n d o w _ = [[UIWi n d o w a llo c] i n itWit h Fra m e:b ou n d s];
  // 创建基准的Co nt r oller对象
    To p M e n u C o nt r ol le r*t o p M e n u   =   [[[To p M e n u C o nt r ol le r   a l lo c]   i n it]
autor ele a s e]; 
    r o otCo nt r oller _  =  [[UINav ig at io nCo nt r oller  a llo c]  i n itWit h R o otVi
e w Co nt r oller:to p M e nu];
 
  // 将主画面的v ie w 追加到Wi n d o w中
  [w i n d o w _ ad d Su b v ie w:r o otCo nt r oller _ .v ie w];
  [w i n d o w _ m a k e KeyA n d Visi ble];

}
- (v oid)d e a llo c {
  [r o otCo nt r oller _ r ele a s e];
  [w i n d o w _ r ele a s e];
  [s u p er d e a llo c];
}
@e n d

大家可以看到,其实只修改了其中三行代码。首先需要导入TopMenuController类,并创建其实例。接着初始化UINavigationController,需要向initWithRootViewController:方法中传入根画面的Controller,这里将创建好的TopMenuController实例传入。然后将UINavigationController的view属性追加到UIWindow中(使用addSubView:方法)。

下面是新追加的主菜单画面TopMenuController的代码。这里将TopMenuController
以UITableViewController子类形式来创建。
[To p M e nu Co nt r oller.h]
#i m p or t < UIK it/UIK it.h >
@i nterfac e To p M e nu Co nt r oller : UITa bleVie w Co nt r oller
{
 @priv ate
  NS M ut a ble A r ray* ite m s _ ;
}
@e n d
[To p M e nu Co nt r oller.m]
#i m p or t "To p M e nu Co nt r oller.h"
@i m ple m e nt at io n To p M e nu Co nt r oller

- (v oid)d e a llo c {
  [ite m s _ r ele a s e];
  [s u p er d e a llo c];
}
- (id)i n it {
  if ( (s elf = [s u p er i n itWit h Style:UITa bleVie w StylePla i n]) ) {
    s elf.t it le = @"主菜单";
    //-------------------------------<1>
    // 创建显示用数组
    ite m s _ = [[NS M ut a ble A r ray a llo c] i n itWit h O bje c ts:
                  @"Vie w Co nt r oller1",
                  @"Vie w Co nt r oller2",
                  n il ];
  }
  r etu r n s elf;
}
# prag m a m a rk ----- UITa bleVie wD at aSou rc e M et h o d s ------ (NSInte g er)t a bleVie w:(UITa bleVie w*)t a bleVie w
nu m b er Of R o w sInSe c t io n:(NSInte g er)s e c t io n {
  r etu r n [ite m s _ c ou nt];
}
- (UITa bleVie w C ell*)t a bleVie w:(UITa bleVie w*)t a bleVie w
c ellForR o wAtIn d e x Pat h:(NSIn d e x Pat h*)i n d e x Pat h {
  // 检查单元是否已经创建
    UITa bleVie w C ell*  c ell  =  [t a bleVie w  d e q u eu e R eu sa ble C ellWit hId e nt i
fi er:@"si m ple-c ell"];
  if ( !c ell ) {
     // 没有创建的单元新创建
        c e l l   =   [[[U I T a b l eVi e w C e l l   a l l o c]   i n it W it h F r a m e:C G R e c t Z e r o
r eu s eId e nt i fi er:@"si m ple-c ell"] autor ele a s e];
  }
  // 设置单元中显示的文本字符串
  c ell.te x t L a b el.te x t = [ite m s _ o bje c t AtIn d e x:i n d e x Pat h.r o w];
  //------<2>
  r etu r n c ell;
}
# prag m a m a rk ----- UITa bleVie wD ele g ate M et h o d s ---------<3>
- (v oid)t a bleVie w:(UITa bleVie w*)t a bleVie w
d id Sele c t R o wAtIn d e x Pat h:(NSI n d e x Pat h*)i n d e x Pat h {
  Class class = NSClassFromString( [items _ objectAtIndex:indexPath.row] );
  id v ie w Co nt r oller = [[[cla ss a llo c] i n it] autor ele a s e];
  if ( v ie w Co nt r oller ) {
        [s e lf.n a v ig at io n C o nt r ol le r   p u s hVie w C o nt r ol le r:v ie w C o nt r ol le r
a n i m ate d:Y ES];
  }
}
@e n d

与表相关的解说将放在第7章中,代码中有不理解的地方,请参考第7章的相关介绍。首先看看init方法中的内容。在titile属性中设置画面的标题(<1>)。使用UINavigationController时,此处设置的标题将在画面的最上方中心位置显示(见图3-7)。接着还创建了 NSArray数组,NSArray数组中的元素将显示在表中。具体处理在 tableView:cellForRowAtIndexPath:方法中,将NSArray中的元素设置到表的单元中。


 

其次,我们再确认一下tableView:didSelectRowAtIndexPath:方法的处理内容。此方法将在表单元被触摸(单击)时调用,参数  indexPath  中保存了具体被触摸(单击)的行信息。

本例中,表单元中直接放置了跳转对象画面的类名,tableView:didSelectRow AtIndexPath:方法中首先创建被触摸行类的实例。然后跳转到对应画面中。调用UINavigationController的pushViewController: animated:方法实现画面跳转;向此方法的第一个参数中传入画面(UIViewController)的实例后,然后就会自动跳转到对应层次的画面中。另外如果将animated参数设置为YES,则下一画面将以动画的形式显示出来。此时UINavigationController实例可以通过UIViewController的navigationController属性获取。只要是UINavigationController管理下的UIViewController,随时都可以通过其navigationController属性 获取UINavigationController实例本身。

这样就算完成了整个层次的画面跳转应用程序。跳转到下一层画面后,将自动显示如图3-8所示的返回按钮。


 

 

点击复制链接 与好友分享!回本站首页
分享到: 更多
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:3.2.1 使用UITabBarController实现并列画面跳转
下一篇:3.2.3 跳转到任意画面
相关文章
图文推荐
1.3.5 有限的屏幕尺
1.2 必备条件
精通iOS开发 : 第7版
3.5 iFunBox
排行
热门
文章
下载
读书

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训
版权所有: 红黑联盟--致力于做最好的IT技术学习网站