zoukankan      html  css  js  c++  java
  • 【iOS基础控件

    A.概念
    1.通常一个app有多个控制器
    2.需要对这些控制器进行管理
    3.有多个view的时候,用一个父view去管理多个子view
    4.控制器管理也是如此,使用给一个父控制器,去控制子控制器
     
    为了方便管理控制器,系统提供了两个控制器
    • UINavigationController
    • UITabBarController
     
    B.UINavigationController的使用
    UINavigationController的使用步骤
    初始化UINavigationController
    设置UIWindow的rootViewController为UINavigationController
    根据具体情况,通过push方法添加对应个数的子控制器
     
    1.初始化
    2.设置为rootViewController
    复制代码
     1 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
     2     // 设置window
     3     self.window = [[UIWindow alloc] init];
     4     self.window.frame = [[UIScreen mainScreen] bounds];
     5     self.window.backgroundColor = [UIColor grayColor]; // window是灰色背景
     6     [self.window makeKeyAndVisible];
     7    
     8    
     9     // 设置UINavigationController
    10     UINavigationController *nvController = [[UINavigationController alloc] init];
    11     nvController.view.backgroundColor = [UIColor blueColor]; // 设置蓝色背景
    12     self.window.rootViewController = nvController;
    13    
    14     return YES;
    15 }
    复制代码
     
    3.通过push方法,增加子控制器
    (1)创建3个控制器和绑定的xib文件
    Image(215)
     
     
    (2)一次push进navigationController的子控制器栈
    复制代码
     1     // 配置第一个子控制器
     2     ViewControllerOne *vc1 = [[ViewControllerOne alloc] init];
     3     [nvController pushViewController:vc1 animated:YES];
     4    
     5     // 配置第二个子控制器
     6     ViewControllerTwo *vc2 = [[ViewControllerTwo alloc] init];
     7     [nvController pushViewController:vc2 animated:YES];
     8    
     9     // 配置第三个子控制器,这是栈顶的控制器
    10     ViewControllerThree *vc3 = [[ViewControllerThree alloc] init];
    11     [nvController pushViewController:vc3 animated:YES];
    复制代码
     
    (3)显示的是栈顶控制器的view
    Image(216)
     
    C.子控制器的管理原理
    1.导航条在状态栏(高度20)下,高度44
    复制代码
    1 - (void)applicationDidBecomeActive:(UIApplication *)application {
    2     // 必须在加载完毕激活app后,所有的view的尺寸位置才能确定
    3     UINavigationController *nvController = (UINavigationController *)self.window.rootViewController;
    4     NSLog(@"%@", NSStringFromCGRect(nvController.view.frame)); // 整个导航控制器的frame
    5     NSLog(@"%@", NSStringFromCGRect(nvController.navigationBar.frame)); // 导航条的frame
    6 }
    7  
    复制代码
    out:
    NavigationController[2669:183137] {{0, 0}, {320, 480}}
    2014-12-19 21:16:30.413 NavigationController[2669:183137] {{0, 20}, {320, 44}}
     
    2.UINavigationController有一个子控制器的栈,使用push方法就是往栈里面添加子控制器
    1 @property(nonatomic,copy) NSArray *viewControllers; // The current view controller stack.
     
    3.push子控制器的同时,替换window上的view,显示的总是栈顶控制器的view
    1 - (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated; // Uses a horizontal slide transition. Has no effect if the view controller is already in the stack.
     
    D.子控制器栈的操作
    1.栈和添加子控制器
    (1)使用"pushViewController"
    1     // 配置第一个子控制器
    2     ViewControllerOne *vc1 = [[ViewControllerOne alloc] init];
    3     [nvController pushViewController:vc1 animated:YES];
     
    (2)使用 "addChildController"
    • UINavigationController中的”viewControllers"成员是一个数组,就是子控制器栈
    • "childViewControllers"的功能也是一样的(这是UIViewController的成员属性)
    • "addChildController"和"pushViewController"的功能一样(这是UIViewController的方法)
     
        // 配置第一个子控制器
    1     ViewControllerOne *vc1 = [[ViewControllerOne alloc] init];
    2     [nvController addChildViewController:vc1];
     
    (3)直接放入viewControllers数组
    1     // 配置第一个子控制器
    2     ViewControllerOne *vc1 = [[ViewControllerOne alloc] init];
    3     nvController.viewControllers = @[vc1];
     
    (4)初始化的时候指定rootViewController
    1     // 传入一个viewController作为 nvController的 rootViewController
    2     nvController = [[UINavigationController alloc] initWithRootViewController:vc1];
     
    注意:不要混用"pushViewController"和"addChildViewController",有些情况会出现没有把控制器加入到栈。而且很混乱,完全不能预见结果。
     
    (5)使用事件进行入栈
    a.给第二个控制器的view加上两个按钮,分别跳向第三个和第四个控制器的view
    Image(217)
     
    b.点击事件方法
    每个控制器都有一个navigationController属性,通知navigationController进行操作
    复制代码
     1 - (IBAction)goToThree {
     2     // 配置第三个子控制器
     3     ViewControllerThree *vc3 = [[ViewControllerThree alloc] init];
     4     [self.navigationController pushViewController:vc3 animated:YES];
     5 }
     6 
     7 - (IBAction)gotoFour {
     8     // 配置第四个子控制器
     9     ViewControllerFour *vc4 = [[ViewControllerFour alloc] init];
    10     [self.navigationController pushViewController:vc4 animated:YES];
    11 }
    复制代码
     
    2.主动出栈
    (1)使用"popViewControllerAnimated:YES",弹出一个控制器
    1 // 这里是第三个,要回到第二个
    2 - (IBAction)backtoTwo {
    3     [self.navigationController popViewControllerAnimated:YES];
    4 }
     
    (2)使用 "popToViewController" 弹出控制器,直到指定的控制器
    (3)使用 "popToRootViewController" 弹出占内的控制器,直到rootViewController,回到栈底的控制器
    复制代码
    1 // 现在是第三个控制器的view,要回到第一个控制器的view
    2 - (IBAction)backtoOne {
    3     // 其实这里拿不到第一个控制器vc1的引用
    4 //    [self.navigationController popToViewController:vc1 animated:YES];
    5    
    6     // 直接弹出,直到导航器的rootViewController,就是第一个子控制器vc1了
    7     [self.navigationController popToRootViewControllerAnimated:YES];
    8 }
    复制代码
     
    E.设置导航条
    1.导航条内容由栈顶控制器控制
    2.使用navigationItem控制导航条内容
    (1)标题title / titleView(这是UIViewController的成员属性)
    1 @property(nonatomic,copy) NSString *title;  // Localized title for use by a parent controller.
     
    sample:设置第一个控制器的title
    1 - (void)viewDidLoad {
    2     [super viewDidLoad];
    3     self.navigationItem.title = @"第一个view";
    4 }
     
    Image(218)
     
    (2)leftBarButtonItem / leftBarButtonItems,会覆盖“返回”按钮
    (3)rightBarButtonItem / rightBarButtonItems
    复制代码
     1 - (void)viewDidLoad {
     2     [super viewDidLoad];
     3     self.navigationItem.title = @"第二个控制器";
     4    
     5 //     设置左上角的item
     6     self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"我要回去" style:UIBarButtonItemStylePlain target:nil action:nil];
     7    
     8     // 设置右上角的item
     9     // 使用bar按钮
    10     UIBarButtonItem *item1 = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCompose target:nil action:nil];
    11    
    12     // 使用自定义view
    13     UIBarButtonItem *item2 = [[UIBarButtonItem alloc] initWithCustomView:[UIButton buttonWithType:UIButtonTypeContactAdd]];
    14    
    15     // 这是这是从右到左排列显示
    16     self.navigationItem.rightBarButtonItems = @[item1,item2];
    17 }
    复制代码
     
    Image(219)
     
    注意: leftBarButtonItems 显示出来是按照数组顺序从左到右,而rightBarButtonItems是从右到左
     
    例如把上面右边的items都放到左边:
        self.navigationItem.leftBarButtonItems = @[item1, item2];
     
    Image(220)
     
    3.设置了上一级title之后,如果没有覆盖leftBarButtonItem(s),会自动使用上一级的title替换"返回"按钮的文字
    Image(221)
     
    -->左上角显示的文字是由上一级的控制器控制的
    navigationItem.backBarButtonItem
    复制代码
    1 // 第二个控制器
    2 - (void)viewDidLoad {
    3     [super viewDidLoad];
    4      ...
    5     // 设置第二个控制器的“返回”样式
    6     self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"速速回2" style:UIBarButtonItemStylePlain target:nil action:nil];
    7 }
    复制代码
     
    Image(222)
     
    4.navigatonBar就是整条导航条
    nvController.navigationBar
    当所有东西加载完毕之后,导航条的frame才能被初始化完毕
    1 - (void)applicationDidBecomeActive:(UIApplication *)application {
    2     // 必须在加载完毕激活app后,所有的view的尺寸位置才能确定
    3     UINavigationController *nvController = (UINavigationController *)self.window.rootViewController;
    4     NSLog(@"%@", NSStringFromCGRect(nvController.view.frame)); // 整个导航控制器的frame
    5     NSLog(@"%@", NSStringFromCGRect(nvController.navigationBar.frame)); // 导航条的frame
    6 }
     
    out:
    2014-12-19 23:12:51.049 NavigationController[4214:236071] {{0, 0}, {320, 480}}
    2014-12-19 23:12:51.050 NavigationController[4214:236071] {{0, 20}, {320, 44}}
     
     

    最后的点击链接图:

    Image(231)

     
    F.利用storyboard导航
    1.创建一个基本的导航界面
    (1)创建一个single view application,删除自带的ViewController类
    Image(223)
     
    (2)删除原来的ViewController,拖入一个NavigationController,并设置为Initial View Controller
    Image(224)
     
    (3)删除自带的rootViewController,拖入一个UIViewController
    Image(225)
     
    (4)设置新拖入的UIViewController为导航器的rootViewController
    Image(226)
     
    (5)设置UIView,这就是第一个页面
    51B7F5B0-9493-46A3-9FB3-3BADD2B7D6C2
     
         双击相应位置就可以编辑文字(例如title),但是使用storyboard方法不能拖入BarButtonItems组。
     
    (6)拖入一个UIView到UIViewController,并且加入一些元素
    Image(227)
     
    运行效果:
    Image(228)
     
    2.创建跳转导航功能
    (1)在第一个控制器的view中加入两个跳转按钮,拖入两个UIViewController
    Image(229)
     
    (2)拖曳指向,使用"push"事件
    Image(230)
     
    实现效果:这样在第一个控制器界面,就能跳转到第二个或者第三个控制器的界面了
     
    注意:不要制造往回导航的按钮,其实是重新创建了一个控制器加入到控制器栈中
    8D8BD0BB-CF93-45A0-8F22-559CCB89ADE2
     
     
    G.控制器的生命周期
    1.生命周期方法
    生命周期方法
     
    2.内存警告处理流程
    当内存不够的时候,优先回收不存在屏幕上的view
    所以应该在viewDidUnload方法中释放数据
     
    内存警告处理
  • 相关阅读:
    53. Maximum Subarray
    64. Minimum Path Sum
    28. Implement strStr()
    26. Remove Duplicates from Sorted Array
    21. Merge Two Sorted Lists
    14. Longest Common Prefix
    7. Reverse Integer
    412. Fizz Buzz
    linux_修改域名(centos)
    linux_redis常用数据类型操作
  • 原文地址:https://www.cnblogs.com/kengsir/p/4281913.html
Copyright © 2011-2022 走看看