0

UIButtons を動的に生成するクラスがあり、セレクター アクションをメソッドと同じクラスに保持して、ジェネリックにしたいと考えています。ボタンをクリックするとクラッシュします。ベローは私のコードです

RB_RadioButton.h

#import <Foundation/Foundation.h>

@interface RB_RadioButton : NSObject {
    NSMutableArray *options;
}

-(id)initWithOptions:(NSArray *)options;

-(void)renderRadioButtons:(UIView *)view initialXPos:(int)initialXPos initialYPos:(int)initialYPos height:(int)height width:(int)width spacing:(int)spacing;

@end

RB_RadioButton.m

#import "RB_RadioButton.h"

@implementation RB_RadioButton {
    NSMutableArray *buttonArray;
}

-(id)initWithOptions:(NSArray *)optionsArray {
    if(self = [super init]){
        options = [[NSMutableArray alloc]initWithArray:optionsArray];
    }
    return self;
}

-(void)renderRadioButtons:(UIView *)view initialXPos:(int)initialXPos initialYPos:(int)initialYPos height:(int)height width:(int)width spacing:(int)spacing {
    buttonArray = [[NSMutableArray alloc]init];
    int xpos = initialXPos, ypos = initialYPos;
    for (int i = 0; i < options.count; i++) {
        UIButton *radio = [[UIButton alloc]initWithFrame:CGRectMake(xpos, ypos, height, width)];
        radio.backgroundColor = [UIColor grayColor];
        [radio setTag:i];

        [radio addTarget:[RB_RadioButton class] action:@selector(actionTap) forControlEvents:UIControlEventTouchUpInside];
        UILabel *l = [[UILabel alloc]initWithFrame:CGRectMake(xpos+30, ypos, height, width)];
        l.text = [options objectAtIndex:i];
        ypos = ypos + height + spacing;       
        [view addSubview:l];
        [view addSubview:radio];
    }
}
-(void)actionTap{
    NSLog(@"lll");
}

@end

viewController.m

#import "RB_ViewController.h"
#import "RB_RadioButton.h"

@interface RB_ViewController ()

@end

@implementation RB_ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    NSArray *arr = [[NSArray alloc]initWithObjects:@"a",@"b",@"c", nil];

    RB_RadioButton *rd = [[RB_RadioButton alloc]initWithOptions:arr];

    [rd renderRadioButtons:self.view initialXPos:20 initialYPos:20 height:20 width:20 spacing:10];

}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

上記のコードは、デバッグ コンソールにメッセージが表示されずにクラッシュします。

助けてください !

ありがとう

4

2 に答える 2

0

それは何ですか:

[radio addTarget:[RB_RadioButton class] action:@selector(actionTap) forControlEvents:UIControlEventTouchUpInside];

actionTapポインタを必要とする通常のメソッドselfですが、オブジェクトで呼び出そうとしていClassます!

この行は次のようになります。

[radio addTarget: self action:@selector(actionTap) forControlEvents:UIControlEventTouchUpInside];

それを機能させるには、メモリ管理も修正する必要があります。コントローラーは、RB_RadioButtonオブジェクトをファイルとして記憶し、dealloc メソッドで解放する必要があります。

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    NSArray *arr = [NSArray arrayWithObjects: @"a",@"b",@"c", nil]; // here also you had a memory leak

    rd = [[RB_RadioButton alloc]initWithOptions:arr]; // rd is object field
    [rd renderRadioButtons:self.view initialXPos:20 initialYPos:20 height:20 width:20 spacing:10];
}

- (void)dealloc {
    [rd release];
    [super dealloc];
}
于 2013-10-01T09:11:56.183 に答える
0

このコード行を記述するたびに、クラス メソッドが必要になるためactionTap、クラス メソッドとして定義すると、次のように動作します。

[radio addTarget:[RB_RadioButton class] action:@selector(actionTap) forControlEvents:UIControlEventTouchUpInside];

+(void)actionTap{
    NSLog(@"lll");
}
于 2013-10-01T09:18:30.303 に答える