iOS开发之UINavigationController(二)

UINavigationController既然能够管理多个控制器,那么这些控制器在UINavigationController中是如何管理、又是如何跳转的呢?

前面曾经提到UINavigationController是通过栈来管理子控制器的。具体原理如下:

1> 在UINavigationController初始化的时候会指定它的根控制器。即把该根控制器放在了栈顶。此时UINavigationController就显示rootViewController的view;


2>当点击某个按钮进入另外一个控制器,UINavigationController会将新的控制器viewController再push到栈的顶部,覆盖在rootViewController的上面。此时UINavigationController显示的控制器就是新的控制器;

3>当点击当前控制器中的某个按钮返回到rootViewController(以前的控制器),UINavigationController会将当前控制器调用pop方法将当前控制器从栈的顶部弹出,并销毁当前控制器;

4>当再点击rootViewController的跳转按钮,执行push方法时,会重新创建viewController,再将它压入栈顶。(执行1>)

上面讲到 UINavigationController 通过 push/pop 方法来控制 viewController 进栈 / 出栈的,这就存在页面之间的跳转。

针对UINavigationController的页面跳转有2种方式:

1>  通过拖线(利用storyboard

现在新建项目,开始拖线。“第一页”是UINavigationController的rootViewController,在rootViewController中添加一个跳转按钮,鼠标右键点击拖线到“第二页”控制器。


运行结果:(看控制器标题就行,忽略颜色)


点击按钮之后:


2>  通过代码

现在开始写代码。我这里创建的是空项目,没有Main.storyboard。如果你创建的不是空项目,可将Main.storyboard删除,并在TARGETS-> Deployment Info -> Main Interface下删除Main即可。

a.    创建并初始化UINavigationController,在项目中New File…两个控制器ViewController和TwoViewController,将ViewController设置为UINavigationController的根控制器,并将UINavigationController作为窗口的根视图,再显示出来。

//创建窗口
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.window.backgroundColor = [UIColor whiteColor];
//创建导航栏,并设置导航栏根视图
ViewController *mainVC = [[ViewController alloc] init];
mainVC.navigationItem.title = @"第一页";
UINavigationController *navigationC = [[UINavigationController alloc] initWithRootViewController:mainVC];
//设置窗口主视图
self.window.rootViewController = navigationC;
//使窗口可见
[self.window makeKeyAndVisible];
b. 在ViewController中,包含TwoViewController头文件,再创建一个跳转按钮。

- (void)viewDidLoad {
    [super viewDidLoad];
    
    //创建按钮
    UIButton *button = [[UIButton alloc] init];
    button.frame = CGRectMake(100, 200, 200, 40);
    [self.view addSubview:button];
    
    //设置按钮属性
    [button setTitle:@"跳到第二页" forState:UIControlStateNormal]; 
   [button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
	
    //监听按钮点击
    [button addTarget:self action:@selector(clickButton) forControlEvents:UIControlEventTouchUpInside]; 
}
- (void)clickButton {
    TwoViewController *two = [[TwoViewController alloc] init];
    [self.navigationController pushViewController:two animated:YES];
}

c. 在第二个控制器的viewDidLoad方法中给第二个控制器添加标题和背景颜色。

self.navigationItem.title = @"第二页";
self.view.backgroundColor = [UIColor redColor];

d. 运行效果,加跳转效果

以上代码写完,UINavigationController管理了两个控制器,利用push/pop就能将控制器推入和弹出栈的顶部,从而实现控制器跳转。

注意:UINavigationController在跳到下一个控制器后,下一个控制器的导航条的左边会自带一个返回按钮。根控制器不能执行pop,即不能被弹出栈。

至此,针对于UINavigationController的控制器跳转已经讲完了。对于UINavigationController的第一种跳转方式(拖线),其中还有两个模式,将在后续文章中讲到。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本框架适用于 使用 NavigationController UITabBarController 的APP 框架QLSNavTab , GitHub地址:https://github.com/qianlishun/QLSNavTab 简介   -------准备工作------- 在AppDelegate中 设置一个控制器为主控制器 , 例如MainController - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds]; MainController *mainVc = [[MainController alloc]init]; // 设置根控制器 self.window.rootViewController = mainVc; // 设置为主控制器并可见 [self.window makeKeyAndVisible]; return YES; } 复制代码 在主控制器 中 复制代码 // 设置Nav背景色 self.navigationBackgroundColor = [UIColor colorWithRed:arc4random_uniform (256)/255.0 green:arc4random_uniform(256)/255.0 blue:arc4random_uniform(256)/255.0 alpha:1.0]; self.childControllerAndIconArr = @[ /************第一个控制器配置信息*********************/ @{ VC_VIEWCONTROLLER : [[OneController alloc]init], //控制器对象 NORMAL_ICON : @"icon_classTable", //正常状态的Icon 名称 SELECTED_ICON : @"icon_classTable_selected", //选中状态的Icon 名称 TITLE : @"表" //Nav和Tab的标题 }, /************第二个控制器配置信息*********************/ @{ VC_VIEWCONTROLLER : [[TwoController alloc]init], NORMAL_ICON : @"icon_me", SELECTED_ICON : @"icon_me_selected", TITLE : @"通讯录" }, @{ /* 如果在此处使用storyboard,需要给storyboard设置storyboardID storyboardID 与 VC_STORYBOARD的value 同名 此处为Three */ VC_STORYBOARD :@"Three", NORMAL_ICON : @"icon_discover", SELECTED_ICON : @"icon_discover_selected", TITLE : @"发现" }, ];
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值