iOS 将storybord中的视图与viewcontroller相关联

来新公司已经20多天了,什么正经事儿都没有干,为什么我换了一个公司还是这么闲,真是日了狗了,为什么就没有一个凶狠的老大逼着我干活,我真的好懒啊,好想有人恐吓我让我干活儿啊,干不完就开除那种!天天吃吃玩玩手机睡睡,肚子上的肉都长成一大堆了,天天睡觉捧着肚子感觉跟怀孕了一样啊摔,为什么没人逼着我健身啊,我好想瘦啊啊啊啊。每天吃零食就花了好多钱,工资到手才10k,房租就要3k啊要死了,每个月吃饭就要2k,地铁200,还得在网上淘淘淘,一个月能存5k就谢天谢地了啊啊啊啊,为什么存不住钱,三年了十万块都没有存够啊,都二十五六了怎么买房子啊,一年才存五万什么时候才能存够首付啊岂可修

我觉得主要是自己太懒了,上个公司没有逼我,这个公司也不逼我,我怎么能就此堕落呢,为了买房子,为了攒够50万,为了18k,一定要振作啊啊啊啊。。。。

我看公司的文档要死了,全英文文档,真的很考验我的忍耐力,我为什么要来外企写蓝牙,我是不是有病

怎么说呢,车到山前必有路,来都来了,bing还帮我提薪,我也答应了他要在这里做两年的,不能食言啊,不蒸馒头争口气,不然对不起bing,别人都帮你一把了,你还不好好干,那不是窝囊废吗

 

这两天看了看文档,总结一下:

 

在storybord中拖入了一个viewcontroller,需要设置这个vc属于的类和storybordID

 

class代表这个视图属于哪一个类,storybordID就是这个视图的id

在用代码进行跳转的时候:

    SBViewController * vc = [self.storyboard instantiateViewControllerWithIdentifier:@"sbVC"];
    [self.navigationController pushViewController:vc animated:YES];

 但是这样就没有办法重写init方法了,不能在init的时候进行传值,只能通过属性来传值了

还有一个需要注意的地方,如果先对vc的view进行操作,后面的传值就无法第一时间显示出来,因为操作view的时候viewDidLoad就会被调用,在viewDidLoad中的操作都是在传值操作之前进行的

 

 

 这种情况的话,view的颜色是黄色,输出的name却是null

虽然说一般人也不会在外面设置什么color,这个对传值的影响不大,但是还是需要知道一下,有时候雷你可以不踩,但是万一掉坑里,哭着喊爸爸都搞不通的时候,可以想想这些东西

 

据群里水友表示,使用storybord的时候界面跳转一般用segue,这里也写一下如何用segue跳转

 

将两个controller连起来,出现segue弹窗 ,这几个选项的意义:

show:push

show detail:替换当前scene

present modally:模态弹出

present as popover:采用浮动窗的形式把新页面展示出来

custom:自定义转换

这几个试的时候只有shouw和present modally成功了,其他的以后用到再说

这个完了之后要给segue设置一个identifier

 

然后在需要的时候调用这个segue,这时候如果想要传值,需要实现 prepareForeSegue方法

 

 

以上是storybord中的页面跳转和传值,下面是xib的使用方法 

 

 在创建新的类的时候勾选xib,就会创建一个同名的xib文件,所以xib不用专门设置identifer,可以直接用

    NibViewController * nib = [[NibViewController alloc] initWithNibName:@"NibViewController" bundle:nil andName:@"lukky"];
    [self.navigationController pushViewController:nib animated:YES];

在代码中可见,这种方法可以自定义init方法用来传值,比较集成一点

 

 

 

然后我想说一下xib,storybord,代码布局的优劣:

复杂而动态的页面用纯代码,

storybord很直观,开发速度快,可以清楚的看到页面跳转动向

如果页面简单,需要重复使用,用xib,比如登陆注册页面等

 

 

 

下面是我抄来的UIView与UIViewController的生命周期总结

重写View的如下方法

@implementation YFView

-(instancetype)init{
    
    self = [super init];
    
    NSLog(@"%s", __func__);
    
    return self;
}

-(instancetype)initWithFrame:(CGRect)frame{
    
    self = [super initWithFrame:(CGRect)frame];
    
    NSLog(@"%s", __func__);
    
    return self;
    
}

-(instancetype)initWithCoder:(NSCoder *)aDecoder{
    
    self = [super initWithCoder:aDecoder];
    
    NSLog(@"%s", __func__);
    
    return self;
    
}

-(void)awakeFromNib{
    
    [super awakeFromNib];
    
    NSLog(@"%s", __func__);
}


-(void)layoutSubviews{
    
    NSLog(@"%s", __func__);
    
}
@end

 

重写ViewController的如下方法

@implementation YFViewController

-(void)loadView{
    
    NSLog(@"%s", __func__);
    
    [super loadView];
}

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    
    NSLog(@"%s", __func__);
    
    self.view.backgroundColor = [UIColor redColor];
}


-(void)viewDidAppear:(BOOL)animated{
    
    NSLog(@"%s", __func__);
    
    [super viewDidAppear:animated];
    
    
}

-(instancetype)init{
    
    self = [super init];
    
    NSLog(@"%s", __func__);
    
    return self;
}

-(instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{
    
    self = [super initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil];
    
    NSLog(@"%s", __func__);
    
    return self;
    
}

-(instancetype)initWithCoder:(NSCoder *)aDecoder{
    
    self = [super initWithCoder:aDecoder];
    
    NSLog(@"%s", __func__);
    
    return self;
    
}

-(void)awakeFromNib{
    
    NSLog(@"%s", __func__);
    
    [super awakeFromNib];
}

@end

 

结论总结

  1. 如果控制器是直接通过代码创建出来的,并且调用方法为[[YFViewController alloc]init]创建VC的生命周期为:
-[YFViewController initWithNibName:bundle:]
-[YFViewController init]
-[YFViewController loadView]
-[YFViewController viewDidLoad]
-[YFViewController viewDidAppear:]

 

  1. 如果创建控制器时勾选了XIB,那么调用方法为[[YFViewController alloc]init]创建VC时的生命周期为:
-[YFViewController initWithNibName:bundle:] 
-[YFViewController init]
-[YFViewController loadView]
-[YFViewController viewDidLoad]
-[YFViewController viewDidAppear:]

 

  1. 如果是通过SB创建控制器,那么VC的生命周期为:
-[ViewController initWithCoder:]
-[ViewController awakeFromNib]
-[ViewController loadView]
-[ViewController viewDidLoad]
-[ViewController viewDidAppear:]

 

  1. 如果纯代码创建UIView,调用方式为YFView *yfView = [[YFView alloc]init];那么它的生命周期为:
-[YFView initWithFrame:]
-[YFView init]
-[YFView layoutSubviews]

 

  1. 如果纯代码创建UIView,调用方式为YFView *yfView = [[YFView alloc]initWithFrame:[UIScreen mainScreen].bounds];那么它的生命周期为:
-[YFView initWithFrame:]
-[YFView layoutSubviews]

 

  1. 如果通过XIB创建UIView,调用方式为NSArray *array = [[NSBundle mainBundle]loadNibNamed:@"YFView" owner:nil options:nil];[array lastObject];那么它的生命周期为:
-[YFView initWithCoder:]
-[YFView awakeFromNib]
-[YFView layoutSubviews]

 

辛辛苦苦把人家的东西复制下来,我也不知道图个啥,明明存个链接就可以的,但是太有用了怕对方哪天不开心删博客,还是自己存下来,233 

 

https://www.jianshu.com/p/66702f38e977

https://blog.csdn.net/xy_26207005/article/details/51002707

https://blog.csdn.net/liuyinghui523/article/details/62036465

 

posted @ 2018-05-02 16:42  电蚊拍  阅读(346)  评论(0编辑  收藏  举报