酒と泪とRubyとRailsと

Ruby on Rails と Objective-C は酒の肴です!

UIViewControllerからUIView部分を切り出す[Objective-C]

UIViewControllerからViewの要素をUIViewに切り出す手順です。相当久しぶりにObjective-Cを触っていて、 片っ端からハマりまくっていますが少しずつ、新しいことやるのはやっぱり超楽しいです!


前提

(1) View的な要素をSampleView.h(m)に切り出し
(2) Viewはスクロールさせる(UIScrollViewの上に要素を載せる)
(3) コントローラ部分はSampleViewController.h(m)に書く。必要な記述のみに絞る
(4) Viewの中でController的な処理を呼び出したい場合は、Delegateで行う

SampleView.h のサンプル

1
2
3
4
5
6
7
8
@protocol sampleViewDelegate <NSObject>
-(void) sampleMethod;
@end

@interface SampleView : UIView <UITextFieldDelegate,UIScrollViewDelegate>
@property(nonatomic, strong) UITextField* textField;
@property(nonatomic, weak) id<sampleViewDelegate> delegate;
@end

SampleView.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
@interface SampleView
@property UITextField* textField;
@end

@implementation SampleView

-(id) init {
  self = [super init];
  if(self) {
    // スクロールビューの生成
    UIScrollView scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 10, 320, 470)];
    [scrollView setContentSize:CGSizeMake(scrollView.frame.size.width, scrollView.frame.size.height)];
    [self addSubview:scrollView];

    // TextFieldの追加
    [scrollView addSubview:_textFiled];
  }
}

-(void) layoutSubviews {
    [super layoutSubviews];

    // TextField
    CGRect rect = CGRectMake(0, 10, 300, 25);
    _textField textFiled = [[UITextField alloc]initWithFrame:rectP];
    _textField.borderStyle = UITextBorderStyleRoundedRect;
    _textField.clearButtonMode = UITextFieldViewModeWhileEditing;
    _textField.returnKeyType = UIReturnKeyDone;
    [_textField addTarget:self.delegate action:@selector(sampleMethod) forControlEvents: UIControlEventEditingDidEnd];
}

// 背景色の設定
- (void)drawRect:(CGRect)rect {
  [[UIColor whiteColor] setFill];
  UIRectFill(CGRectInset(self.bounds, 0, 0));
}

@end

SampleViewController.m のサンプル

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@interface SampleViewController ()
@property(nonatomic, strong) View *sampleView;
@end

@implementation SampleViewController

-(void) loadView {
    [super viewDidLoad];

    _sampleView = [[HogeView alloc] init];
    self.view = _sampleView;

    // デリゲートのメソッドをこちらで作る
    _sampleView.delegate = self;
}

// イベントハンドラ
-(void) sampleMethod {
  ....
}

あとがき

今日は一日、Objective-Cのコードをわかりやすく書くための初歩を勉強しました。 さすがにちょっと書き方を忘れすぎているので、しばらく本を読んでいくつもり!

Special Thanks

逆引きObjective-C for iPhoneアプリ - デリゲートを自作クラスに実装する

iPhone - ViewとViewControllerの繋ぎ方 - Qiita

おすすめの書籍