iOS小知识点04

今天在项目中遇到一个小知识点,就是在A控制器中的导航控制器push出B控制器时,要求B控制器中的视图上导航条是隐藏的。可采用如下方法实现:
在B控制器中

- (void)loadView {
  [super loadView];
  // 在被push出来时隐藏导航条
  self.navigationController.navigationBar.hidden = YES;
}

之前在看别人高仿美团的Demo中,有用到有TabBar时,push出B控制器,隐藏B控制器的TabBar.
实现方法是在B控制器中

- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // 隐藏底部tabBar
        self.hidesBottomBarWhenPushed = YES;
    }
    return self;
}

下面是在网上找的一些资料对 loadView 和initWithNibName的理解

无论XIB还是代码创建都会调用loadView方法。
self.view为nil时才会被调用。
手工创建视图时,loadView被调用时self.view还为nil。
一般在该方法中手工定制view。
XIB创建视图时,loadView仍会被调用、loadView被调用时XIB定制的视图还没创建完成,若是再覆写该方法的话、会将XIB定制的视图覆盖掉。
所以,纯手工定制视图时,一般在该方法中写;XIB定制视图时、不要覆写该方法。

initWithNibName

一般情况下调用 init方法或者调用initWithNibName方法实例化UIViewController, 不管调用哪个方法最终都会调用initWithNibName方法。
当控制器被initWithNibName:并加入到导航控制器的栈中时,它不会加载nib文件,直到nib文件被实际显示。因此控制器在nib文件中定 义的内容,例如label,可能还没有实例化。此时label可能只是一个nil指针,需要额外使用代码中实现的属性来存储信息。可以在 viewWillAppear:方法中对nib实例化的对象属性进行设置

你可能感兴趣的:(iOS小知识点04)