iOS 笔记三: UITextView和视图控制器生命周期(View Controller LifeCycle)

一. UITextView
1. 有点像UILabel,但是可以换行、选择文字、编辑、滚动(scroll), 等等。
使用NSMutableAttributedString来设置文本及其属性。
使用属性:
@property (nonatomic, readonly) NSTextStorage *textStorage;
来获取UITextView中的NSMutableAttributedString,
NSTextStorage是NSMutableAttributedString的子类。
在ios7中,你可以简单的修改这个属性,UITextView会自动更新。

2.设置字体(font)
在UITextView中,每个字符的字体可以不一样。但是也有个属性用来指定一个全局的字体。
@property (nonatomic, strong) UIFont *font;
修改字符的字体不会重置其他属性(e.g. color, underline, etc.).

3.在UITextView中使用TextKit实现高级布局:
以下属性定义在UITextView中,哪里可以放置文字:
@property (readonly) NSTextContainer *textContainer;

以下对象将从textStorage中读取字符并把字符排放到textContainer中:
@property (readonly) NSLayoutManager *layoutManager;

这些对象非常强大,比如说textContainer可以指定不规则区域,如环绕图片排版。
你可以自己去查看你感兴趣的功能。

二. 视图控制器生命周期(View Controller LifeCycle)
1. 视图控制器有一个生命周期,在其生命周期中将有一系列的消息发送给它处理。
通常通过重写类方法来处理具体的消息。

生命周期的开始:创建视图控制器
在ios MVC模型中,MVC通常是通过故事板(storyboard)实例化的。
也有在代码中实例化的情况, 但是比较少。
接下来:
Outlet 设置;
显示和消失;
图形变化;
低内存;
在每个阶段,iOS会触发一个或一组控制器的方法。

2.在实例化并且设置了Outlet后,viewDidLoad将被调用,这是初始化的好时机:
<pre name="code" class="html">- (void)viewDidLoad
{
    [super viewDidLoad]; // always let super have a chance in lifecycle methods
    // do some setup of my MVC
}


 但是请小心,这个时候视图的图形(边框)还没有设置,还不知道你的程序是运行在多大的屏幕上,是iPhone 5还是iPad? 所以这个时候不要初始化依赖图形的部分。3. 在视图出现在屏幕上之前,你会得到通知:-(void)viewWillAppear:(BOOL)animated;你会得到一次"loaded"类的消息一次,但是可能"appear"和"disapper"很多次。所以不要把需要放到viewDidLoad中的东西放到这个方法中,否则你的代码会做很多不需要的、重复的动作。4.在视图将要消失在屏幕上时,你也会得到通知:这里可以做一些清理工作: 
-(void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisapper:animated];
    [self rememberScrollPosition];
    [self saveDataToPermanentStore];
}

5.显示和消失方法还有"did"版本:
-(void)viewDidApper:(BOOL)animated;
-(void)viewDidDisapper:(BOOL)animated;

6.图形变化?
大部分时候这个会被AutoLayout自动处理:
-(void)view{Will,Did}LayoutSubviews;
这个函数会在视图的frame变化时被调用,然后视图的孩子将会被重新布局(re-layed out).

7.自动旋转(autorotate)
当设备旋转后,如果满足以下条件,顶层view controller 将会重新设置边界:
A. view controller 的shouldAutorotate函数返回YES.
B. view controller 的supportedInterfaceOrientations函数返回新的orientation.
C. 应用(application)允许旋转到这个方向(在Info.plist文件中定义).
通常在MVCs中支持旋转是不错的选择。

8.在低内存的情况下,didReceiveMemoryWarning将会被调用。
这种情况很少发生,但是好的代码设计应该预料到这种情况,如处理图片和声音时。
任何占用较大内存的对象,会被重复创建的对象,都应该释放(set strong pointer to nil).

9.awakeFromNib
这个方法会发送给任何从storyboard中出来的对象。
这个方法会在outlet设置之前被调用(i.e. 在MVC 加载之前).
如果可以的话,尽量不要把代码放到这里(e.g viewDidLoad or viewWillApper).
任何在你的控制器的init方法中放置的代码也必须放置到awakeFromNib,
因为从storyboard中出来的对象不会调用init方法。
-(void)setup{};//do something which can't wait until viewDidLoad
-(void)awakeFromNib { [self setup]; };
//UIViewController的指定initializer是initWithNibName:bundle:
-(instancetype)initWithNibName:(NSString *)name bundle:(NSBundle *)bundle
{
    self = [super initWithNibName:name bundle:bundle];
    [self setup];
    return self;
}
一般情况下,我们用不到awakeFromNib这个函数。

10.总结
实例化(从storyboard中).
awakeFromNib
设置outlet
viewDidLoad
(当图形形状已经定下来了)
    viewWillLayoutSubviews: and viewDidLayoutSubviews:
(下一组函数将会重复调用,如果你的MVC经常出现和消失在屏幕上)
    viewWillAppear and viewDidAppear;
        (在任何可视的时候,图形形状发生变化,如device ratation)
        viewWillLayoutSubviews: and viewDidLayoutSubviews:
        (如果是autorotation,你会收到will/didRatateTo/From message,虽然很少使用).
    viewWillDisappear; and viewDidDisappear:
(如果出现低内存情况)
    didReceiveMemoryWarning
(已经没有unload方法,以上就是全部的生命周期)
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值