我正在尝试从自定义类中以编程方式向按钮添加操作。但是,执行该操作时,我总是收到错误消息。我已经阅读了很多有关如何执行此操作的信息,但显然在某个地方犯了一个错误,无法弄清楚在哪里。
该按钮是在第一个实例中通过将其拖动到情节提要上而创建的。然后,我将控件拖到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];
}
下面是自定义类的Header和Implementation文件。
头文件
#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
您创建了一个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
指向类实例的指针显然是令人迷惑的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句