-
Notifications
You must be signed in to change notification settings - Fork 336
1.4 UIViewController2 ModalViewController
参考 : UIViewController Class Reference | View Controller Programming Guide for iOS
ModalViewController は一時的にユーザの操作の中に割り込んで表示させるもの。公式ドキュメントには以下のようなケースで使うことを想定している。
- ユーザから直ちに情報を収集するため
- 何らかのコンテンツを一時的に表示するため
- 作業モードを一時的に変更するため
- デバイスの向きに応じて代替のインターフェイスを実装するため
- 特殊なアニメーショントランジションを使用する(またはトランジションなしの)新しいビュー 階層を表示するため
UIViewController は一つの ModalView を表示することが可能。そのときに、Modal を表示する ViewController と ModalViewController には親子関係が出来る。
具体的には親の ViewController の property:presentedViewController に表示されている ModalViewController の参照が代入され、ModalViewController の propterty:presentingViewController に親の ViewController の参照が代入される。
注意:modalViewController property は iOS6 から deplecated なので使用しないようにしましょう。
また、ModalViewController の上に ModalViewController をだすこともできる。
MixiPostViewController *postViewController = [[MixiPostViewController alloc] init];
[self presentViewController:postViewController animated:YES completion:nil];
- modalTransitionStyle 画面遷移の方法
typedef enum {
UIModalTransitionStyleCoverVertical = 0,
UIModalTransitionStyleFlipHorizontal,
UIModalTransitionStyleCrossDissolve,
UIModalTransitionStylePartialCurl,
} UIModalTransitionStyle;
- modalPresentationStyle - iPad の場合に表示形式を変更できる
typedef enum {
UIModalPresentationFullScreen = 0,
UIModalPresentationPageSheet,
UIModalPresentationFormSheet,
UIModalPresentationCurrentContext,
} UIModalPresentationStyle;
[self dismissViewControllerAnimated:YES completion:nil];
このメソッドを呼べば、トップレベルの ModalViewController が dismiss されます。公式ドキュメントには原則として呼び出した ViewControlelr が消すべきと書いてあります。状況に応じて使い分けてください。
MixiChildViewController で閉じるボタンを押したことを MixiViewControlelr が知る必要があります。このようにある VC から VC へ何らかの通知を送る手段の一つとして delegate があります。
delegate とはあるクラスで処理できない処理を他のクラスに代わりに処理させるパターンです。この場合、MixiChildViewController でボタンが押されたイベントだけキャッチし、MixiChildViewControlelr を閉じる処理は MixiViewControlelr に任せることにします。
MixiChildViewController.h
#import <UIKit/UIKit.h>
@protocol MixiChildViewControllerDelegate <NSObject> // [1] プロトコルの宣言
-(void)didPressCloseButton;
@end
@interface MixiChildViewController : UIViewController
@property (nonatomic, weak) id<MixiChildViewControllerDelegate> delegate; // [2] delegate オブジェクト
- (IBAction)pressClosedButton:(id)sender;
@end
MixiChildViewController.m
-(IBAction)pressClosedButton:(id)sender
{
// [3] delegate オブジェクトにメッセージを送信
if([_delegate respondsToSelector:@selector(didPressCloseButton)]){
[_delegate didPressCloseButton];
}
}
プロトコルはメッソド宣言の集合体です。上記では、MixiChildViewController が MixiChildViewControllerDelegate というプロトコルで、他のクラスに任せたいメソッドを宣言しています。
実際に処理を任せたいクラスのインスタンスが代入されています。id で、MixiChildViewControllerDelegate を採用しているオブジェクトの代入することを条件づけることが出来ます。この場合 MixiViewController が入ります。MixiViewController は自身で MixiChildViewController の参照を持つので、こちらで weak property にしておかないと循環参照が起きます。
respondsToSelector: で delegate 先に delegate method が実装されているかを確認します。実装されていれば、実際にメッセージを送ります。
MixiViewController.h
#import "MixiChildViewController.h"
@interface MixiViewController : UIViewController <MixiChildViewControllerDelegate> // [4] protocol の採用
MixiViewController.m
- (void)pressModalButton:(id)sender
{
MixiChildViewController *mixiChildViewController = [[MixiChildViewController alloc] init];
mixiChildViewController.delegate = self; // [5] delegate 先として自身を代入
[self presentViewController:mixiChildViewController animated:YES completion:nil];
}
// [6] delegate method の実装
#pragma mark - MixiPostViewControllerDelegate methods
-(void)didPressCloseButton
{
[self dismissViewControllerAnimated:YES completion:nil];
}
複数ある場合は "," でつなげます。
MixiViewController.h
#import "MixiChildViewController.h"
@interface MixiViewController : UIViewController <MixiChildViewControllerDelegate, AaaDelegate, BbbDelegate>
これを忘れると MixiChildViewController から通知を受け取ることが出来ませんのでお忘れなく。
protocol の採用をすることで method の補完が効くようになります。
Modal の 表示、非表示アニメーションが同時に起きるとアニメーションの衝突でクラッシュするので気をつけてください。
はじめに
-
導入
-
1.3 UIViewController1 UIViewController のカスタマイズ(xib, autoresizing)
-
UIKit 1 - container, rotate-
-
UIKit 2- UIView -
-
UIKit 3 - table view -
-
UIKit 4 - image and text -
-
ネットワーク処理
-
ローカルキャッシュと通知
-
Blocks, GCD
-
設計とデザインパターン
-
開発ツール
-
テスト
-
In-App Purchase
-
付録