所以我暂时不再问这个问题,因为我知道解决方案很可能非常简单。但是我已经走到了我的系绳的尽头,所以这里是:
我已经以编程方式创建了一个UIButton并将其链接到一个方法,但它无法正常工作!!
.h定义
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@interface CreaterPage : UIViewController
{
IBOutlet UIView *postcardView;
IBOutlet UIButton *returnButton;
}
-(void)goBack:(UIButton *)button;
@end
.m定义
#import "CreaterPage.h"
@implementation CreaterPage
-(void)viewDidLoad
{
NSLog(@"Creater Page View Loaded Successfully");
UIButton *goHomeButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[goHomeButton addTarget:self action:@selector(goBack:) forControlEvents:UIControlEventTouchDown];
[goHomeButton setTitle:@"Go Back" forState:UIControlStateNormal];
goHomeButton.frame = CGRectMake(100, 100, 100, 100);
[self.view addSubview:goHomeButton];
}
-(void)goBack:(UIButton *)button
{
NSLog(@"Home");
}
@end
基本上,当我运行代码时,按钮显示为已定义,但只要按下它,我的程序就会崩溃。
在main.m文件中,它给出了错误
线程1:编程接收信号:“EXC_BAD_ACCESS”。
在线
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
我尝试了所有种类,只是转而以编程方式创建它,因为我无法通过界面构建器来完成它。
所以我希望有人可以改变我的少年方式并告诉我哪里出错了:D
谢谢,
马特
编辑1:将@selector(goBack)更改为@selector(goBack :)
答案 0 :(得分:1)
我的第一个猜测是你的行动被定义为:
[goHomeButton addTarget:self action:@selector(goBack) forControlEvents:UIControlEventTouchDown];
请注意方法名后面没有冒号的@selector(goBack)
。 .m
文件中的方法定义为:
-(void)goBack:(UIButton *)button
所以我想把你的行动改为@selector(goBack:)
会让事情变得清晰。
旁注:正如您所做的那样,定义IBAction
的发件人类型非常罕见。虽然只要您的UIButton
是导致该方法被调用的唯一 UI对象,您可能不会遇到任何问题,但这种做法非常糟糕。您应该将方法签名更改为:
-(IBAction)goBack:(id)sender
另请注意使用IBAction
代替void
。虽然它们在语法上是相同的,但IBAction
使读者和Interface Builder清楚地知道哪些方法可用于链接。
答案 1 :(得分:0)
更改
[goHomeButton addTarget:self action:@selector(goBack) forControlEvents:UIControlEventTouchDown];
到
[goHomeButton addTarget:self action:@selector(goBack:) forControlEvents:UIControlEventTouchDown];