iOS小知识点04

作者: 丨n水瓶座菜虫灬 | 来源:发表于2016-05-06 17:30 被阅读376次

今天在项目中遇到一个小知识点,就是在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实例化的对象属性进行设置

相关文章

网友评论

  • 马铃薯蜀黍:代码创建view时,[super loadView]可以省略,
    丨n水瓶座菜虫灬:@马铃薯蜀黍 我刚试了一下,如果调用了loadView方法,而在方法中不去实例化self.view,省略[super loadView]会进入死循环,一直调用loadView和viewDidLoad两个方法,如你所说,最好还是在loadView中去实例化self.view,省略掉[super loadView]。
    马铃薯蜀黍:@丨n水瓶座菜虫灬 我的理解是这样的,[super loadView]是告诉系统从IB创建view,如果重写loadView就是想要代码写了,所以这个时候是能省略,
    丨n水瓶座菜虫灬:@马铃薯蜀黍 重写loadView方法,在方法中没有实例化self.view的话还是要调用[super loadView]吧,不然self.view一直为空,在viewDidLoad中调用[self.view addSubview]时,由于self.view == nil,会进入loadView方法,loadView方法又没有实例化view,会一直死循环下去;
  • 方克己:你的排版可以改改
    丨n水瓶座菜虫灬: @烧开的汽水 嗯嗯,谢谢提醒

本文标题:iOS小知识点04

本文链接:https://www.haomeiwen.com/subject/guejrttx.html