我正在尝试从自定义类中以编程方式向按钮添加操作。但是,当我执行操作时,我一直收到错误。我已经阅读了很多关于如何做到这一点,但显然在某个地方犯了一个错误,无法弄清楚在哪里。
通过将按钮拖到故事板上,在第一个实例中创建按钮。然后我控制拖动到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
答案 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
或断点确保相关对象(自定义对象,按钮)不为零。