iOSノート3:UItextViewおよびビューコントローラライフサイクル(ViewController LifeCycle)


一.UItextView
1.UIlabelに似ていますが、改行、文字選択、編集、スクロールなどができます.
NSMutableAttributedStringを使用して、テキストとそのプロパティを設定します.
属性の使用:
@property (nonatomic, readonly) NSTextStorage *textStorage;
UItextViewのNSMutableAttributedStringを取得するには、
NSTextStorageは、NSMutableAttributedStringのサブクラスです.
ios 7では、このプロパティを簡単に変更できます.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 Control LifeCycle)
1.ビューコントローラには、一連のメッセージが処理に送信されるライフサイクルがあります.
通常、クラスメソッドを書き換えることで、特定のメッセージを処理します.
ライフサイクルの開始:ビューコントローラの作成
ios MVCモデルでは、MVCは通常、ストーリーボード(storyboard)によってインスタンス化される.
コードでインスタンス化する場合もありますが、比較的少ないです.
次に、
Outlet設定;
表示と消去;
グラフィックの変化;
低メモリ;
各フェーズで、iOSはコントローラの1つまたは複数のメソッドをトリガーします.
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が変化するときに呼び出され、ビューの子供が再レイアウトされる.
7.自動回転(autorotate)
デバイスが回転すると、次の条件を満たすと、最上位ビューコントローラは境界を再設定します.
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
アウトレットの設定
viewDidLoad
(図形の形状が決まったら)
    viewWillLayoutSubviews: and viewDidLayoutSubviews:
(次の関数のセットは繰り返し呼び出されます.MVCがよく画面に表示され、消えている場合は)
    viewWillAppear and viewDidAppear;
        (device ratationなどのグラフィック形状が視覚的に変化する)
        viewWillLayoutSubviews: and viewDidLayoutSubviews:
        (autorotationの場合はwill/didRatateTo/From messageを受け取りますが、あまり使われません).
    viewWillDisappear; and viewDidDisappear:
(低メモリの場合)
    didReceiveMemoryWarning
(すでにunloadメソッドはありませんが、以上がすべてのライフサイクルです)