カスタムビュー上のUIButtonのタップアクションをViewControllerで設定したい
以下のソースサンプルのように、カスタムビューのボタンのaddTargetメソッドをViewControllerに書きたいのですが、セレクターのメソッドが呼ばれません。
《試したこと》
- カスタムビュー内にaddTargetメソッドを書いて、引数targetをnilにしてtapButton:を呼び出すように書くと動きましたが、警告が出ますし、tapButtonというメソッド名をViewController側で自由に決めることができないので、違うと思います。
- サイズの関係で動かない場合もあるということで、backView、descriptionView、descriptionView.buttonの各frameをNSLogで表示させましたが、buttonだけ{0,0},{0,0}でした。
サンプルソースの(※)でもbutton.backgroundColorへの設定が反映されていませんし、どうやらbuttonのプロパティにアクセスできていないことが原因と考えましたが、理由が分かりません。
何かおかしなことをしてしまっているのでしょうか。
カスタムビュー
@interface DescriptionView : UIView
@property (weak) UIButton *button;
@property NSString *buttonStr;
@end
@implementation DescriptionView
- (void)drawRect:(CGRect)rect {
UIButton *closeButton = [UIButton buttonWithType:UIButtonTypeSystem];
[closeButton setTitle:_buttonStr forState:UIControlStateNormal];
closeButton.frame = CGRectMake(0, CGRectGetMaxY(rect)-40, rect.size.width, 40);
_button = closeButton;
[self addSubview:closeButton];
}
ViewController
@implementation ViewController
- (void)viewDidLoad {
// TableViewを置いてます。ちなみにサイズは画面サイズ。
// カスタムビューの背面にくる土台ビュー
UIView *backView = [[UIView alloc]initWithFrame:_tableView.frame];
backView.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.4];
backView.alpha = 0;
backView.tag = VIEW_INFO;
[self.view addSubview:backView];
//カスタムビュー
DescriptionView *descriptionView = [[DescriptionView alloc]init];
descriptionView.buttonStr = @"next"; // <-これは反映される
descriptionView.button.backgroundColor = [UIColor yellowColor]; // <-(※)これは反映されない
[descriptionView.button addTarget:self action:@selector(tapButton:) forControlEvents:UIControlEventTouchUpInside];
descriptionView.frame = CGRectInset(_tableView.frame, 20, 30);
[backView addSubview:descriptionView];
//だんだん表す
[UIView animateWithDuration:0.8 animations:^{
backView.alpha = 1;
}];
}