zoukankan      html  css  js  c++  java
  • iOS-导航控制器

    一、UINavigationController
    1.常见方法
    1> 将子控制器vc压入栈中
    [self.navigationController pushViewController:vc animated:YES];
    
    2> 出栈(弹出栈顶控制器)
    [self.navigationController popViewControllerAnimated:YES];
    
    3> 直接跳到栈底控制器(回到根控制器)
    [self.navigationController popToRootViewControllerAnimated:YES];
    
    2.使用原理
    1> 导航控制器内部有个viewControllers栈来存放所有的子控制器
    2> 展示在导航控制器上面的永远是栈顶控制器的view
    
    3.一般情况下,导航栏上面显示什么内容,由当前栈顶控制器的navigationItem属性决定
    * navigationItem.title : 导航栏的中间标题(也可以直接通过控制器的title属性设置标题)
    * navigationItem.titleView : 导航栏的中间控件
    * navigationItem.leftBarButtonItem : 导航栏左边的按钮
    * navigationItem.rightBarButtonItem : 导航栏右边的按钮
    
    4.特殊:导航栏左上角的返回按钮 文字 由上一个控制器的navigationItem.backBarButtonItem决定
    * 返回按钮不需要监听(默认的操作就是出栈)
    
    二、利用storyboard完成导航
    1.storyboard中用来跳转的每一根线 都是 一个 UIStoryboardSegue对象
    1> 自动跳转 (从 某个按钮 拖线到 下一个目的控制器)
    
    2> 手动跳转 (从 来源控制器 拖线到 下一个目的控制器)
    * 一定要给segue绑定一个唯一的identifier
    * 如何跳转?通过来源控制器的一个方法来执行这个UIStoryboardSegue对象
    [self performSegueWithIdentifier:@"login2home" sender:nil];
    
    2.UIStoryboardSegue对象
    // 唯一标识
    @property (nonatomic, readonly) NSString *identifier;
    // 来源控制器
    @property (nonatomic, readonly) id sourceViewController;
    // 目的控制器
    @property (nonatomic, readonly) id destinationViewController;
    
    3.通过UIStoryboardSegue对象完成的跳转过程
    1> 初始化(创建)UIStoryboardSegue对象
    
    2> 设置UIStoryboardSegue对象的identifier标识  和 sourceViewController来源控制器
    
    3> 创建目的控制器,并且设置为UIStoryboardSegue对象的destinationViewController属性
    
    4> 在跳转之前,会调用一次sourceViewController的下面方法
    // 后面的sender参数就是当初调用performSegueWithIdentifier:sender:方法传入的参数
    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    
    5> 执行UIStoryboardSegue对象
    [segue perform];
    
    6> 会将destinationViewController目的控制器压入栈中
    
    三、显示本地网页
    // 1.获得about.html文件的URL
    NSURL *url = [[NSBundle mainBundle] URLForResource:@"about.html" withExtension:nil];
    // 2.封装一个请求对象
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    // 3.加载请求
    [webView loadRequest:request];
    
    四、内存警告的处理过程
    1.当控制器接收到内存警告时,会调用 didReceiveMemoryWarning 方法
    
    2.didReceiveMemoryWarning方法内部的默认实现
    1> 首先会检测控制器的view在不在屏幕上
    if (self.view.superview == nil) { // 检测控制器的view在不在屏幕上
        // 就会尝试销毁控制器的view
        // 即将销毁的时候,就会调用控制器的 viewWillUnload
        // 销毁完毕的时候,就会调用控制器的 viewDidUnload方法
    } else {
        // 不销毁控制器的view
    }
    
    3.当需要再次使用控制器的view时,又会调用loadView方法来创建view
    
    4.接着会调用一系列的生命周期方法
    viewDidLoad ---> ......
    
    5.生命周期循环
    loadView --> viewDidLoad --> ..可见.. --内存警告--> didReceiveMemoryWarning ---> viewWillUnload --> viewDidUnload ---再次使用---> loadView
    
    五、UITabBarController
    1.以选项卡的形式展示多个子控制器
    
    2.设置需要显示的子控制器
    1> 设置子控制器数组
    NSArray *viewControllers;
    
    2> 逐个添加子控制器
    // 通过这个方法添加的子控制器会自动添加到viewControllers数组中
    - (void)addChildViewController:(UIViewController *)childController;
    
    3.设置子控制器对应标签的文字和图片
    * 通过子控制器的tabBarItem属性设置
    vc.tabBarItem.title = @"最近"; // 设置标题
    vc.tabBarItem.image = [UIImage imageNamed:@"tab_recent_press.png"]; // 设置图标
    
    六、利用Modal形式展示控制器
    1.如何展示
    // vc就是要展示的新控制器
    [self presentViewController:vc animated:YES completion:^{
        NSLog(@"展示完毕");
    }];
    
    2.如何关闭modal控制器
    [self dismissViewControllerAnimated:YES completion:nil];
    
    七、切换控制器
    1.UINavigationController
    
    2.UITabBarController(不常用)
    
    3.Modal
    
    4.直接更改UIWindow的rootViewController
    
    5.自定义切换效果
  • 相关阅读:
    无法重用Linq2Entity Query
    The Joel Test
    MSBuilder directly instead of default VSComplie with keyborad shotcut 原创
    客户端缓存(Client Cache)
    关于代码重构和UT的一些想法,求砖头
    ExtJS2.0实用简明教程 应用ExtJS
    Perl information,doc,module document and FAQ.
    使用 ConTest 进行多线程单元测试 为什么并行测试很困难以及如何使用 ConTest 辅助测试
    史上最简单的Hibernate入门简介
    汽车常识全面介绍 传动系统
  • 原文地址:https://www.cnblogs.com/DarbyCJ/p/3668553.html
Copyright © 2011-2022 走看看