jubilee

Programing, Books and more...

1つの画面の上下で同じViewControllerを使う方法(addChildViewController)

  • 1つの画面(A-ViewController)の上下にImageViewとスライダーを表示し、 同じ処理をさせる必要があった
  • 画面上に2つずつUIImageViewとUISliderを配置して制御してもいいけど、同じことするのは面倒
  • 同じ処理なので1つのViewController(UIImageViewとUISliderを持った)を作成(MovieVCとする)
  • 大元の画面(A-ViewController)で、上下に作成したMovieVCを呼べばいいのでは?
  • Container ViewController?

テスト用にMovieViewはWebを表示するようにして、作成してみた。こんな感じ。
image

StoryBoardは、こんな感じで設定。
image

大元の画面(A-ViewController)

.m

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
// MovieVCをインポート
#import "MovieViewController.h"

@interface DetailViewController ()
// 画面の上下にUIViewを配置して接続
@property (weak, nonatomic) IBOutlet UIView *upperView;
@property (weak, nonatomic) IBOutlet UIView *lowerView;

// MovieVCのプロパティを用意
@property (nonatomic) MovieViewController *upperMovieVC;
@property (nonatomic) MovieViewController *lowerMovieVC;
@end

@implementation DetailViewController
- (void)viewDidLoad
{
    [super viewDidLoad];

    // MovieVCのインスタンスを生成([MovieViewController new]ではダメ)
    _upperMovieVC = [self.storyboard instantiateViewControllerWithIdentifier:@"MovieScene"];
    _lowerMovieVC = [self.storyboard instantiateViewControllerWithIdentifier:@"MovieScene"];

    // 自身のVCの子とする
    [self addChildViewController:_upperMovieVC];
    [self addChildViewController:_lowerMovieVC];

    // 用意してあるUIViewに生成した子(MovieVC)のviewを追加
    [_upperView addSubview:_upperMovieVC.view];
    [_lowerView addSubview:_lowerMovieVC.view];

    // 子に追加した旨を通知
    [_upperMovieVC didMoveToParentViewController:self];
    [_lowerMovieVC didMoveToParentViewController:self];

    // テストのために用意したMovieVCのメソッドに違うURLを渡す
    [_upperMovieVC connectURL:@"http://google.co.jp"];
    [_lowerMovieVC connectURL:@"http://yahoo.co.jp"];
}
@end

MovieVC

.h

1
2
3
@interface MovieViewController : UIViewController<UIWebViewDelegate>
- (void)connectURL:(NSString *)urlString;
@end

.m

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
- (void)viewDidLoad
{
    [super viewDidLoad];
    NSLog(@"MovieView viewDidLoad");
}

- (void)connectURL:(NSString *)urlString
{
    NSURL *url = [NSURL URLWithString:urlString];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    _webView.delegate = self;
    [_webView loadRequest:request];
}

- (void)willMoveToParentViewController:(UIViewController *)parent
{
    NSLog(@"MovieVC");
}