简体   繁体   English

UIButton“addTarget”崩溃应用程序

[英]UIButton “addTarget” crashes app

Just learning to add actions with code in my .m file and my first attempt throws an exception and crashes the app. 只是学习使用我的.m文件中的代码添加操作,我的第一次尝试会引发异常并导致应用程序崩溃。

This is an authentication script that I hope will communicate with my web server. 这是一个身份验证脚本,我希望能与我的Web服务器通信。 Here is the relevant code (this is all in the .m file, very simple .h file): 这是相关的代码(这都是.m文件,非常简单的.h文件):

.h (header) file: .h(标题)文件:

#import <UIKit/UIKit.h>

@interface Login_ViewController : UIViewController <UITextFieldDelegate>

@end

.m (implementation) file: .m(实现)文件:

- (void)viewDidLoad {
    UILabel *emailLabel = [[UILabel alloc] initWithFrame:CGRectMake(31.0f, 75.0f, 256.0f, 20.0f)];
    emailLabel.text = @"Email Address";
    emailLabel.backgroundColor = [UIColor grayColor];
    emailLabel.textColor = [UIColor whiteColor];
    UITextField *emailField = [[UITextField alloc] initWithFrame:CGRectMake(31.0f, 100.0f, 256.0f, 32.0f)];
    emailField.delegate = self;
    emailField.placeholder = @"Enter email address";
    emailField.borderStyle = UITextBorderStyleRoundedRect;
    [self.view addSubview:emailLabel];
    [self.view addSubview:emailField];
    UILabel *passLabel = [[UILabel alloc] initWithFrame:CGRectMake(31.0f, 175.0f, 256.0f, 20.0f)];
    passLabel.text = @"Password";
    passLabel.backgroundColor = [UIColor grayColor];
    passLabel.textColor = [UIColor whiteColor];
    UITextField *passField = [[UITextField alloc] initWithFrame:CGRectMake(31.0f, 200.0f, 256.0f, 32.0f)];
    passField.delegate = self;
    passField.placeholder = @"Enter Password";
    passField.borderStyle = UITextBorderStyleRoundedRect;
    passField.secureTextEntry = YES;
    UIButton *loginButton = [[UIButton alloc] initWithFrame:CGRectMake(31.0f, 275.0f, 256.0f, 32.0f)];
    [loginButton setTitle:@"Login" forState:UIControlStateNormal];
    [loginButton addTarget:self action:@selector(authenticate) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:passLabel];
    [self.view addSubview:passField];
    [self.view addSubview:loginButton];
    [self.view setBackgroundColor: [UIColor grayColor]];
    UIAlertView *noAccount = [[UIAlertView alloc] initWithTitle:@"Welcome to T-of-U" message:@"Please enter your TofU credentials." delegate:self cancelButtonTitle:@"continue" otherButtonTitles: nil];
    [noAccount show];
    [super viewDidLoad];
}

also in the .m file (IBAction for the button): 同样在.m文件中(按钮的IBAction):

-(IBAction)authenticate:(id)sender{
    // This will be the validation code
    // if we validate we will set the default Setting with accountID here.
    UIAlertView *auth1 = [[UIAlertView alloc] initWithTitle:@"You clicked a button" message:@"Oh, do you want to login do you?" delegate:self cancelButtonTitle:@"Sure.. Why not!" otherButtonTitles: nil];
    [auth1 show];
}

I am using a storyboard with a View that has a custom class of login_ViewController and it loads successfully based on a check for a local setting for account ID. 我正在使用一个带有View的Storyboard,它具有一个自定义类的login_ViewController,并且它会根据对帐户ID的本地设置的检查成功加载。 This window is only pulled up if they have not logged in before, so I can authenticate and get that account ID to store locally. 如果之前没有登录,则只会启动此窗口,因此我可以进行身份​​验证并获取该帐户ID以在本地存储。 I am still experimenting with programmatically creating all these items as you can see in the viewDidLoad section. 我仍在尝试以编程方式创建所有这些项目,您可以在viewDidLoad部分中看到。

Is this failing because I don't have the button/IBAction reference in the .h file , or is it ok to use the addTarget method where its all in the .m file? 这是否失败,因为我没有.h文件中的按钮/ IBAction引用,或者是否可以使用addTarget方法,其中所有文件都在.m文件中?

Crash info from the log: 日志中的崩溃信息:

2012-01-08 04:54:32.868 TofU-5[10452:10103] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[Login_ViewController authenticate]: unrecognized selector sent to instance 0x6c94780'

Your fix may be as easy as: 您的修复可能很简单:

[loginButton addTarget:self action:@selector(authenticate:) forControlEvents:UIControlEventTouchUpInside];

(add a COLON after the authenticate name in your @selector ). (在@selectorauthenticate名称后面添加一个COLON)。 If a method takes any parameter, there will be a colon after it and for the run time environment to be able to send a message to it, that colon needs to be included in the selector of the action target. 如果一个方法接受任何参数,它后面会有一个冒号,并且运行时环境能够向它发送消息,冒号需要包含在动作目标的选择器中。

I hope this makes sense and helps you out! 我希望这有意义并帮助你!

ps it wouldn't hurt to add ps它不会伤害添加

-(IBAction)authenticate:(id)sender

to the .h file. 到.h文件。

IBAction here is an abbreviation for InterfaceBuilder-Action so this actually helps a lot more if you're building the interface in a XIB file. 这里的IBAction是InterfaceBuilder-Action的缩写,所以如果你在XIB文件中构建接口,这实际上会有很多帮助。 Because you're setting the target programatically, you could just use -(void) authenticate (no colon, because your method uses or needs no parameters), but don't do this yet until you get more overall experience with Objective C coding and actions. 因为你是以编程方式设置目标,所以你可以使用-(void) authenticate (没有冒号,因为你的方法使用或不需要参数),但是在你获得更多有关Objective C编码的整体经验之前不要这样做。动作。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM