0

私は、UIButton クラスを割り当てようとしている UIViewController クラスを持っています。これがサンプルコードです。

MyViewController.m 
- (void)viewDidLoad
{
CGRect frame = CGRectMake(companybuttonxOffset, companybuttonyOffset, buttonWidth, buttonHeight);
CustomButton *customButton = [[CustomButton alloc]initWithFrame:frame];
[self.view addSubview:customButton];
[super viewDidLoad];
}
CustomButton.h

#import <UIKit/UIKit.h>

@interface CustomButton : UIButton {
}
@property (nonatomic, assign) NSInteger toggle;
- (void)buttonPressed: (id)sender;
@end


CustomButton.m

#import "CustomButton.h"

@implementation CustomButton
@synthesize toggle;
- (id) initWithFrame:(CGRect)frame
{
if (self = [super initWithFrame:frame]) {
//custom button code
[self addTarget: self action: @selector(buttonPressed:) forControlEvents: UIControlEventTouchUpInside];

}
return self;
}
- (void)buttonPressed: (id)sender
{
    NSLog(@"buttonPressed !!!!!");
}
@end

ボタンはビューコントローラーに存在しますが、ボタンを押すと、このエラーが発生し続けます - [UIButton buttonPressed:]: unrecognized selector sent to instance 0xb1dca50

答えをたくさん探した後に私が理解していることから、IBでボタンをサブクラス化するときにinitWithFrameが呼び出されることはありません。代わりに、initWithCoder を使用する必要があります。これは正しいですか ?これがそれなら、NSCoder とは何か、どのように使用できるのかわかりません。
これに対する解決策を探すのにうんざりしています。助けてください。

4

2 に答える 2

0

通常、すべてのターゲットをコントローラー層に配置する必要があることに同意しますが、これを試してみてください。

- (id)initWithCoder:(NSCoder *)coder
{
    if (self = [super initWithCoder:coder])
    {
        [self customButtonInit];
    }

    return self;
}


- (id)initWithFrame:(CGRect)frame
{
    if (self = [super initWithFrame:frame])
    {
        [self customButtonInit];
    }

    return self;
}


- (void)customButtonInit
{
    [self addTarget: self action: @selector(buttonPressed:) forControlEvents: UIControlEventTouchUpInside];
}
于 2012-09-28T17:35:44.537 に答える
0

IB では、ボタンのクラスを CustomButton に変更していないと思います。したがって、これはまだ UIButton です。

それにもかかわらず、私はこれがあまり良い設計ではないことをここで rdelmar に支持します。ボタン自体ではなく、View Controller がイベントを処理する必要があります。

于 2012-09-28T17:33:37.647 に答える