Skip to content

1.4 UIViewController2 ModalViewController

yuki tamazawa edited this page Sep 3, 2013 · 3 revisions

参考 : UIViewController Class Reference | View Controller Programming Guide for iOS

概要

ModalViewController は一時的にユーザの操作の中に割り込んで表示させるもの。公式ドキュメントには以下のようなケースで使うことを想定している。

  • ユーザから直ちに情報を収集するため
  • 何らかのコンテンツを一時的に表示するため
  • 作業モードを一時的に変更するため
  • デバイスの向きに応じて代替のインターフェイスを実装するため
  • 特殊なアニメーショントランジションを使用する(またはトランジションなしの)新しいビュー 階層を表示するため

UIViewController は一つの ModalView を表示することが可能。そのときに、Modal を表示する ViewController と ModalViewController には親子関係が出来る。

modal1 View Controller Programming Guide for iOS から引用

具体的には親の ViewController の property:presentedViewController に表示されている ModalViewController の参照が代入され、ModalViewController の propterty:presentingViewController に親の ViewController の参照が代入される。

注意:modalViewController property は iOS6 から deplecated なので使用しないようにしましょう。

modal_deprecated

また、ModalViewController の上に ModalViewController をだすこともできる。

modal2 View Controller Programming Guide for iOS から引用

表示方法

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;

消し方と delegate

dismissViewController

[self dismissViewControllerAnimated:YES completion:nil];

このメソッドを呼べば、トップレベルの ModalViewController が dismiss されます。公式ドキュメントには原則として呼び出した ViewControlelr が消すべきと書いてあります。状況に応じて使い分けてください。

dismissViewController

delegate と protocol

MixiChildViewController で閉じるボタンを押したことを MixiViewControlelr が知る必要があります。このようにある VC から VC へ何らかの通知を送る手段の一つとして delegate があります。

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];
    }
}

[1] protocol

プロトコルはメッソド宣言の集合体です。上記では、MixiChildViewController が MixiChildViewControllerDelegate というプロトコルで、他のクラスに任せたいメソッドを宣言しています。

[2] delegate オブジェクト

実際に処理を任せたいクラスのインスタンスが代入されています。id で、MixiChildViewControllerDelegate を採用しているオブジェクトの代入することを条件づけることが出来ます。この場合 MixiViewController が入ります。MixiViewController は自身で MixiChildViewController の参照を持つので、こちらで weak property にしておかないと循環参照が起きます。

[3] delegate オブジェクトにメッセージを送信

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];
}

[4] protocol の採用

複数ある場合は "," でつなげます。

MixiViewController.h

#import "MixiChildViewController.h"

@interface MixiViewController : UIViewController <MixiChildViewControllerDelegate, AaaDelegate, BbbDelegate>

[5] delegate 先として自身を代入

これを忘れると MixiChildViewController から通知を受け取ることが出来ませんのでお忘れなく。

[6] delegate method の実装

protocol の採用をすることで method の補完が効くようになります。

注意事項

Modal の 表示、非表示アニメーションが同時に起きるとアニメーションの衝突でクラッシュするので気をつけてください。

はじめに

  1. iOSについて

  2. Xcode最初のステッフ

  3. 導入

  4. Objective C の基礎

  5. メモリ管理

  6. 1.3 UIViewController1 UIViewController のカスタマイズ(xib, autoresizing)

  7. 1.3 UIViewController1 UIViewController のカスタマイズ(storyboard)

  8. UIViewController2 - ModalViewController

  9. UIViewController2 - ModalViewController(storyboard)

  10. UIViewController3 - ライフサイクル

  11. HomeWork 1 Objective C の基本文法

  12. HomeWork 2 UIViewControllerとModalViewController

  13. HomeWork 3 UIViewController + Animation

  14. UIKit 1 - container, rotate-

  15. UINavigationController

  16. UITabController

  17. Custom Container View Controller

  18. Supporting Multiple Interface Orientations

  19. HomeWork 1 - タブバーからモーダルビューを表示する

  20. HomeWork 2 - NavigationController

  21. HomeWork 2.3 デバイスことに回転対応

  22. UIKit 2- UIView -

  23. UIView

  24. UIView のカスタマイズ

  25. UIView Animation

  26. HomeWork 1 - UIScrollView

  27. UIKit 3 - table view -

  28. UITableView について

  29. UITableViewとNavigationController

  30. custom UITableViewCell の作成

  31. UITableViewのその他のオプション、カスタマイズ

  32. HomeWork 1 - Dynamic height with a custom uitableviewcell

  33. UIKit 4 - image and text -

  34. UIImagePickerController

  35. Assets Library

  36. UITextFiled, UITextView

  37. KeyboardNotification

  38. Homework 1 - フォトの複数枚選択

  39. ネットワーク処理

  40. NSURLConnection

  41. JSONのシリアライズとデシリアライズ

  42. UIWebView

  43. ローカルキャッシュと通知

  44. NSUserDefaults, Settings Bundle

  45. NSFileManager

  46. Key Value Observing

  47. NSNotification、NSNotificationCenter を用いた通知

  48. UILocalNotification

  49. Blocks, GCD

  50. Blocks

  51. GCD

  52. 【演習】GCD,-Blocksを用いたHTTPリクエストマネージャの作成

  53. 設計とデザインパターン

  54. クラス設計 1

  55. クラス設計 2

  56. [クラス設計演習] (https://github.com/mixi-inc/iOSTraining/wiki/9.3-%E3%82%AF%E3%83%A9%E3%82%B9%E8%A8%AD%E8%A8%88%E6%BC%94%E7%BF%92)

  57. 開発ツール

  58. Instruments, デバッガ

  59. CocoaPods

  60. テスト

  61. iOS開発におけるテスト

  62. GHUnit

  63. Kiwi

  64. KIF

  65. In-App Purchase

  66. In-App Purchase

  67. 付録

  68. Tips of Xcode

  69. Auto Layout 入門

  70. Auto Layout ドリル

Edit sidebar

Clone this wiki locally
You can’t perform that action at this time.