UI基础__UIWindow/UIViewController

周威
2023-12-01
// 让窗口成为主窗口并显示出来
 [self.window2 makeKeyAndVisible];
// 成为主窗口
[self.window1 makeKeyWindow];

 // 创建控制器
    // ************************第一种方式:通过代码创建
//    UIViewController *vc = [[UIViewController alloc] init];
//    vc.view.backgroundColor = [UIColor orangeColor];


    //********************** 第二种方式:通过xib创建    
//    HMViewController *vc = [[HMViewController alloc] initWithNibName:@"HMView" bundle:nil];

    //******************* 第三种方式:通过stroyboard创建控制器
    // 如果没有在info.plist文件中配置最主要的storyboard,程序不会自动加载任何项目中存在的storyboard文件。如果存在多个stroyboard,则会加载最主要的storyboard.

    // 加载sb
    // 下面代码仅仅是将stroyboard加载到内存中了,并没有创建stroyboard中的控制器。
    UIStoryboard *sb = [UIStoryboard storyboardWithName:@"test" bundle:nil];
    // 创建箭头指向的控制器
//    UIViewController *vc =[sb instantiateInitialViewController];
    // 根据标示创建控制器
    UIViewController *vc =[sb instantiateViewControllerWithIdentifier:@"grayVc"];

    // 将控制器赋值给窗口的根控制器
    self.window.rootViewController = vc;
 //***************************** 创建导航控制器
/ 创建子控制器
    HMOneViewController *one = [[HMOneViewController alloc] init];
    // 创建导航控制器
    UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:one];
 // 创建子控制器的方法
    // 导航控制器管理子控制器是以栈的形式来管理。栈的特点:先进后出

HMOneViewController *vc1 = [[HMOneViewController alloc] init];
   1、 [nav addChildViewController:vc1];

   2、 [nav pushViewController:vc1 animated:YES];
//回到首页
- (IBAction)backHome {
    // 回到上一个控制器(将当前栈顶控制器出栈)
//    [self.navigationController popViewControllerAnimated:YES];

    // 将除根控制器以为的所有控制器出栈
//    NSArray *viewControllers = [self.navigationController popToRootViewControllerAnimated:YES];
//    NSLog(@"%@",viewControllers);

//    HMOneViewController *oneVc = [[HMOneViewController alloc] init];
    // 回到指定的控制器界面
    // 传人的控制器必须是已经添加到导航控制器中。
    [self.navigationController popToViewController:self.navigationController.viewControllers[0] animated:YES];
}

// 设置标题
    self.navigationItem.title = @"控制器1控制器制";
    // 设置下一个控制器返回按钮的标题
    self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"返回" style:UIBarButtonItemStyleDone target:nil action:nil];


    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:nil action:nil];

    // leftBarButtonItem属性覆盖系统默认的返回按钮
    self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"返回" style:UIBarButtonItemStylePlain target:self action:@selector(back)];
}
  // titleView优先级高于title
    self.navigationItem.titleView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"menu_icon_bulb"]];


/**
 *  返回传入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;
}
  • 控制器view的生命周期方法
注: 重写时一定要调用父类的
/**
 *  当控制器的view即将要显示时调用
 */
 * (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    NSLog(@"%@---%@", self.class ,@"viewWillAppear");
}
/**
 *  当控制器的view已经显示完毕调用
 */
 * (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
//    NSLog(@"%@---%@", self.class ,@"viewDidAppear");

//    NSLog(@"viewDidAppear -- %@",self.view.window);
}
/**
 * 当控制器的view加载完毕调用
 */
 * (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"%@--%@", self.class ,@"viewDidLoad");
}
/**
 *  当控制器的view即将要消失时调用
 */
 * (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    NSLog(@"%@---%@", self.class ,@"viewWillDisappear");
}
/**
 *  当控制器的view已经消失完毕调用
 */
 * (void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:animated];
    NSLog(@"%@---%@", self.class ,@"viewDidDisappear");
}
-(void)dealloc {
    NSLog(@"%@---%s", self.class ,__FUNCTION__);
}
  • 跟内存相关

/**
 *  当控制器view即将要卸载时调用
 */
- (void)viewWillUnload {
    [super viewWillUnload];
    NSLog(@"%@---%s", self.class ,__FUNCTION__);

    self.view = nil;
}

/**
 *  当控制器view卸载完毕时调用
 */
- (void)viewDidUnload {
    [super viewDidUnload];
    NSLog(@"%@---%s", self.class ,__FUNCTION__);

//    self.provices = nil;

}

/**
 *  当控制器收到内存警告时调用
 */
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];



    NSLog(@"%@--didReceiveMemoryWarning",self.class);
}
 类似资料: