以编程方式向按钮添加操作

时间:2014-02-16 13:37:06

标签: iphone objective-c

我正在尝试从自定义类中以编程方式向按钮添加操作。但是,当我执行操作时,我一直收到错误。我已经阅读了很多关于如何做到这一点,但显然在某个地方犯了一个错误,无法弄清楚在哪里。

通过将按钮拖到故事板上,在第一个实例中创建按钮。然后我控制拖动到ViewControler.h文件来获取:

@property (strong, nonatomic) IBOutlet UIButton *testButtonForClass;

在ViewControler.m中,我这样做:

- (void)viewDidLoad
{
    [super viewDidLoad];

    testClass *myClass = [[testClass alloc]init];
    myClass.myButton = self.testButtonForClass;
    [myClass assignActionTargets];
}

以下是自定义类标头和实现文件。

标题文件

#import <Foundation/Foundation.h> 

@interface testClass : NSObject

@property (nonatomic, strong) UIButton *myButton;

-(void)assignActionTargets;

@end

实施档案

#import "testClass.h"

@implementation testClass

-(void)assignActionTargets{    
    [self.myButton addTarget:
    self action:@selector(myButtonInnerTap) 
    forControlEvents:(UIControlEventTouchUpInside)]; 
}

-(void)myButtonInnerTap{
     UIAlertView *a = [[UIAlertView alloc]initWithTitle:nil 
     message:@"testClass says hello" 
     delegate:nil 
     cancelButtonTitle:@"Dismiss" 
     otherButtonTitles:nil, nil];

    [a show];
}

@end

2 个答案:

答案 0 :(得分:1)

您创建了一个testClass实例,但没有保留引用,因此它会在viewDidLoad结束时取消分配。

- (void)viewDidLoad {
    [super viewDidLoad];

    TestClass *myClass = [[TestClass alloc] init];
    myClass.myButton = self.testButtonForClass;
    [myClass assignActionTargets];

    // myClass gets deallocated here!
}

单击该按钮时,它会尝试访问您指定的目标,但现在这是指向无效内存段的悬空指针,从而导致崩溃。

您必须对myClass保持强烈的引用,以便在单击按钮时使其保持活动状态。宣布强大的财产是实现这一目标的好方法。

@property (nonatomic, strong) TestClass *myThingy;

- (void)viewDidLoad {
    [super viewDidLoad];

    self.myThingy = [[testClass alloc] init];
    self.myThingy.myButton = self.testButtonForClass;
    [self.myThingy assignActionTargets];
}

代码样式注释:请使用一些命名约定。类名应该大写(我已经在上面的片段中更改了,因为它会杀死我......)并且使用myClass作为指向类的实例的指针很简单。

答案 1 :(得分:0)

首先,参数nil的双otherButtonTitles是“有问题的”。把它减少到一个。

其次,确保您的调用类正确保留了按钮和对象。

最后,通过NSLog或断点确保相关对象(自定义对象,按钮)不为零。