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
结论总结
- 如果控制器是直接通过代码创建出来的,并且调用方法为[[YFViewController alloc]init]创建VC的生命周期为:
-[YFViewController initWithNibName:bundle:] -[YFViewController init] -[YFViewController loadView] -[YFViewController viewDidLoad] -[YFViewController viewDidAppear:]
- 如果创建控制器时勾选了XIB,那么调用方法为[[YFViewController alloc]init]创建VC时的生命周期为:
-[YFViewController initWithNibName:bundle:] -[YFViewController init] -[YFViewController loadView] -[YFViewController viewDidLoad] -[YFViewController viewDidAppear:]
- 如果是通过SB创建控制器,那么VC的生命周期为:
-[ViewController initWithCoder:] -[ViewController awakeFromNib] -[ViewController loadView] -[ViewController viewDidLoad] -[ViewController viewDidAppear:]
- 如果纯代码创建UIView,调用方式为YFView *yfView = [[YFView alloc]init];那么它的生命周期为:
-[YFView initWithFrame:] -[YFView init] -[YFView layoutSubviews]
- 如果纯代码创建UIView,调用方式为YFView *yfView = [[YFView alloc]initWithFrame:[UIScreen mainScreen].bounds];那么它的生命周期为:
-[YFView initWithFrame:] -[YFView layoutSubviews]
- 如果通过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