0827-navigationController-0604

------------------------------

四大对象关系图

-----------------------

控制器的3中创建方式

创建一个空项目 - 无storyboard empty application  Appdelegate.m里导入 #import "NJViewController.h"

1、NJViewController *vc = [[NJViewController alloc] init]; // 另外还会创建一个空白的 view

2、用storyboard对象创建控制器

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Test" bundle:nil]; //nil 等同于 [NSBundle mainBundle]

NJViewController *vc = [storyboard instantiateInitialViewController]; // storyboard中控制器有启动箭头, 同时控制器指定class为 NJViewController

ViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"two"]; // storyboard中控制器无箭头, 但是有指定storyboard identifier名称 ,控制器指定类为ViewController

3、代码创建带xib的控制器

// xib方式 nil代表 [NSBundle mainBundle]  ,指定xib 拖一个view ,指定输入这个xib 属于哪个类 first owner 控制器类 ,连线first owner到view上 让这个控制器拥有这个view

NJViewController *vc = [[NJViewController alloc] initWithNibName:@"One" bundle:nil];

 

//  NJAppDelegate.m

#import "NJAppDelegate.h"
#import "NJViewController.h"

@implementation NJAppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // 1.创建UIWindow
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.backgroundColor = [UIColor whiteColor];
    
    /*
    // 2.创建控制器
    // 2.1第一种创建方式
    NJViewController *vc = [[NJViewController alloc] init];
    vc.view.backgroundColor = [UIColor redColor];
    */
    /*
    // 2.2第二种创建方式
//    NJViewController *vc = [[NJViewController alloc] init];
    
    // 加载UIStoryboard(注意:仅仅是加载名称叫做Test的storyboard, 并不会创建storyboard重的控制器以及控件)
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Test" bundle:nil];
    
    // 创建storyboard中箭头指向的控制器
    // NJViewController *vc = [storyboard instantiateInitialViewController];
    
    // UIViewController *vc = [storyboard instantiateInitialViewController];
     
    UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"two"];
//    UINib *nib = [UINib nibWithNibName:@"" bundle:[NSBundle mainBundle]];
//    [[nib instantiateWithOwner:nil options:nil] lastObject];
    */
    
    // 2.3第三种创建方式
    // was unable to load a nib named "One"'
    // loaded the "One" nib but the view outlet was not set.'

   NJViewController *vc = [[NJViewController alloc] initWithNibName:@"One" bundle:nil];
    
    self.window.rootViewController = vc;
    
    // 3.让UIWindow显示出来
    [self.window makeKeyAndVisible];
    return YES;
}

 

 

nib加载方式

UINib *nib = [UINib nibWithNibName:@"" bundle:[NSBundle mainBundle]];
//    [[nib instantiateWithOwner:nil options:nil] lastObject];

 

创建single view application 空项目 AppDelegate.m - 方法 didFinishLaunchingWithOptions 方法里已经有了 self.window.rootViewController = 控制器.view

模仿有storyboard的项目控制器的创建

1、创建带storyboard的项目   删除Main

//  NJAppDelegate.m

#import "NJAppDelegate.h"
#import "NJViewController.h"

@implementation NJAppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
   
    // Override point for customization after application launch.
    // 1.创建winodw
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    // 2.创建控制器
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    NJViewController * vc = [storyboard instantiateInitialViewController];
    // 3.设置window的根控制器
    self.window.rootViewController = vc;
    // 4.显示window
    [self.window makeKeyAndVisible];
    
    return YES;
}

-----------------------------

 控制器view的创建方式

1、创建empty application

2、ApplicationDelegate.m里导入头文件 FFViewController.h

3、和控制器同名称的xib文件 控制器 创建的view的时候 可以省略 initWithNibName:@"One" bundle:nil];

4、相比上面同名 去掉Controller 创建的xib更优先

5、自定义控制器的view一般用loadView()方法   优先级最高

6、控制器里有一个nibName属性

7、控制器[ViewController alloc] init] 没有设置view属性会 自动添加一个空的veiw  view只有一个frame(320,580) 颜色等属性没有

 

 

--------

控制器的view用到的时候才加载

  控制器显示的view在显示的时候才调用了loadView()方法  

或者给vc.backgroundcolor赋值的时候也会开始加载了

控制器的view懒加载 用的时候再加载

isViewLoaded方法判断控制器的view是否已经被加载

控制器的view加载完毕就会调用viewDidLoad方法

----------

NavigationController 添加其他字控制器

1、创建empty application

2、创建导航控制器   设置根控制器为导航控制器  导航控制器添加push压入栈 一个UIViewController对象带xib的 

3、导航控制器pop到某个控制器

4、控制器viewDidLoad 设置当前控制器的navigationItem.title   self.navigationItem.title = @"***"; //同时这个title也是下一个控制器的 返回文字

5、back设置

设置下一个navigation的左边的返回按钮方法:

当前navigationController设置 backBarButtonItem =[ [UIBarButtomItem alloc] initWithTitle:@"" style:UIBarButtomItemStylePlain target:nil action:nil];

6、栈顶部控制器左边标题/titleView设置

navigationItem.titleView   navigationItem.leftBarButtonItem = [UIButon alloc]位置显示成了想设计的控件 只能是栈顶控制器能设置

 

初始化导航控制器第一个控制器(栈底控制器) [UINavigationController alloc] initWithRootViewController:oneVc];

导航控制器高度为1个navigation bar 高度44   底部一个导航控制器view bounds与window的bounds一样

push操作不会销毁其他的控制器 并且要新增加一个控制器到栈里面,    会改变其他view往左边移动  , pop的时候会销毁控制器

导航控制器的 NSArray *viewControllers(等同于childViewControllers) 充当栈

 

导航控制器添加子控制器 也可以通过addChildViewControllers来完成

导航控制器只有一个navagation bar导航条  所有自控制器共用一个navigation bar

注意点:

nav.viewControllers = @[oneVc];

nav.childViewControllers是只读的 所以不能设置值

nav.topViewController

nav.poptoRootViewControllers 弹到最上面   并移除其他所有子控制器

self.navigationController

 self.barButtonItems

 最好在AppDelegate.m - (void)applicationDidBecomeActive中打印当前navigationController 的头部navigationBar 的数据

 IOS6 navigationController的view高度等于screen高度 - 44 -20

----------

NavigationController拖控件

 新xcode6.4将 抛弃了  push modal (因为有缺陷)  只有show、 show detail 、present moally 、poper presentation 、custom

一般还是代码来比较好   这里只了解即可   

第二个push到第三个   第三个push到第二个  都会忘栈里添加新控制器  导致问题出现

1、创建single view

2、删除storyboard中的view controller

3、删除viewController.h .m

4、拖进 NavigationController控件

5、删除 里面的tableViewController 值保留一个控制器在界面里

6、拖一个UIViewController控件vc1

7、NavigationController控件右键连线rootViewController到UIViewController控件vc1

8、vc1控件 里面拖一个Button控件

9、再拖一个UIViewController控件vc2    vc1里的button拖一根线到vc2 选择push
 --------

控制器的view生命周期

 

// 当控制器的view加载完毕就调用
- (void)viewDidLoad
{
    [super viewDidLoad];
    NSLog(@"One -  viewDidLoad");
}

// 控制器的view即将显示的时候调用
- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:YES];
    NSLog(@"One -  viewWillAppear");
}

// 控制器的view完全显示的时候调用
- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    NSLog(@"One -  viewDidAppear");
}

// 控制器的view即将消失的时候调用
- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    NSLog(@"One -  viewWillDisappear");
}
// 控制器的view完全消失的时候调用
- (void)viewDidDisappear:(BOOL)animated
{
    [super viewDidDisappear:animated];
    NSLog(@"One -  viewDidDisappear");
}

// 控制器的view即将销毁的时候调用
- (void)viewWillUnload
{
    [super viewWillUnload];
}
// 控制器的view完全销毁的时候调用
- (void)viewDidUnload
{
    [super viewDidUnload];
    // 清空不需要的属性
//    [self.foods release];
    self.foods = nil;
}

//- (void)setFoods:(NSArray *)foods
//{
//    if (_foods != foods) {
//        [foods release];
//        _foods = [foods retain];
//    }
//}

// 接收到内存警告的时候调用
- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
    // NSLog(@"One  didReceiveMemoryWarning");
}

  

控制器的方法

----------

其他不重要的

 

/**
 *  返回传入veiw的所有层级结构
 *
 *  @param view 需要获取层级结构的view
 *
 *  @return 字符串
 */
- (NSString *)digView:(UIView *)view
{
    if ([view isKindOfClass:[UITableViewCell class]]) return @"";
    // 1.初始化
    NSMutableString *xml = [NSMutableString string];
    
    // 2.标签开头
    [xml appendFormat:@"<%@ frame=\"%@\"", view.class, NSStringFromCGRect(view.frame)];
    if (!CGPointEqualToPoint(view.bounds.origin, CGPointZero)) {
        [xml appendFormat:@" bounds=\"%@\"", NSStringFromCGRect(view.bounds)];
    }
    
    if ([view isKindOfClass:[UIScrollView class]]) {
        UIScrollView *scroll = (UIScrollView *)view;
        if (!UIEdgeInsetsEqualToEdgeInsets(UIEdgeInsetsZero, scroll.contentInset)) {
            [xml appendFormat:@" contentInset=\"%@\"", NSStringFromUIEdgeInsets(scroll.contentInset)];
        }
    }
    
    // 3.判断是否要结束
    if (view.subviews.count == 0) {
        [xml appendString:@" />"];
        return xml;
    } else {
        [xml appendString:@">"];
    }
    
    // 4.遍历所有的子控件
    for (UIView *child in view.subviews) {
        NSString *childXml = [self digView:child];
        [xml appendString:childXml];
    }
    
    // 5.标签结尾
    [xml appendFormat:@"</%@>", view.class];
    
    return xml;
}
不需要掌握 - 返回传入veiw的所有层级结构

 

posted @ 2016-03-04 09:09  海龙王来了  阅读(137)  评论(0编辑  收藏  举报
友情链接:废钢破碎机  带式压滤机