2012-01-08 17 views
2

私の.mファイルにコードを含むアクションを追加するだけで、最初の試行で例外がスローされ、アプリがクラッシュする。UIButton "addTarget"がアプリをクラッシュする

これは私のウェブサーバと通信することを望む認証スクリプトです。

.H(ヘッダ)ファイル:

#import <UIKit/UIKit.h> 

@interface Login_ViewController : UIViewController <UITextFieldDelegate> 

@end 

.M(実装)ファイル:

ここに関連するコード(これはすべての.mファイル、非常に単純な.Hファイルである)であります

-(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]; 
} 

私はlogin_Vのカスタムクラスを持って見るとストーリーボードを使用しています:.mファイル(ボタンのIBAction)中も

- (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]; 
} 

iewControllerを呼び出すと、アカウントIDのローカル設定のチェックに基づいて正常にロードされます。このウィンドウは以前にログインしていない場合にのみプルアップされるため、認証してそのアカウントIDをローカルに保存することができます。私はまだviewDidLoadセクションで見ることができるように、これらのすべてのアイテムをプログラムで作成することを試しています。

.hファイルにボタン/ IBAction参照がないため、または.mファイルのすべての場所でaddTargetメソッドを使用しても問題ありません。ログから

クラッシュ情報:

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

(あなた@selectorauthenticate名の後にコロンを追加します):

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' 
+6

'addTarget:action:forControlEvents:'メソッドで 'authenticate'の後にコロンを追加するだけで、' IBAction'は必要ありません。プログラムでアクションを追加する場合は 'void'はここでもOKです。 :) – Kjuly

+0

なぜ人々は常にツール/ IDEと言語/ APIを混ぜるのですか?これはXcodeの質問ではありません。これはObjective-CまたはCocoaの質問です。 –

答えて

8

あなたの問題を修正する修正プログラムを同じように簡単かもしれません。メソッドがパラメータを取る場合は、後にコロンがあり、実行時環境にメッセージを送信できるようにするには、そのコロンをアクションターゲットのセレクタに含める必要があります。

私はこれが意味を成してあなたを助けてくれることを願っています!

p.s. .hファイルに

-(IBAction)authenticate:(id)sender 

を追加しても問題ありません。

IBActionここにInterfaceBuilder-Actionの略語があります。これは、XIBファイルにインターフェイスを構築する場合に、これが実際にはもっと役立ちます。ターゲットをプログラマチックに設定しているので、-(void) authenticate(コロンは使用しないため、メソッドはパラメータを使用するか、必要としないため)を使用できますが、Objective Cのコーディングとアクションの全体的な使用経験が増えるまで、

+0

あなたは私の永遠の感謝を勝ち取った...私の存在のベーンはシンタックス!!!!私は9分後にアップ票/アンサーをしてくれます。 – Silvertiger

+0

実際に私はストーリーボードにアプリ全体を構築しているので、xibファイルを使用していません。これは、ストーリーボード上にありましたが、ストーリーボードに表示されているビュー間の関連付けやリンクにリンクされていない、または参照されていないページをプルする最初の試みでした。私は、ログインビューにタイトルと識別子を与え、動的に読み込むことができることを非常にうれしく思いました:) – Silvertiger

+0

次に、次の危機に移ります。「私は動的に作成したテキストフィールドの値を取得できません認証されたIBAction内のページ上で.. YAY! " ...学習曲線を吸う:) – Silvertiger

関連する問題