5

プログラムでテーブルビューに追加された UIButton があります。問題は、触れたときに認識されないセレクターがインスタンスに送信されたというエラーメッセージに遭遇することです。

    UIButton *alertButton = [UIButton buttonWithType:UIButtonTypeInfoDark];     
    [alertButton addTarget:self.tableView action:@selector(showAlert:) 
          forControlEvents:UIControlEventTouchUpInside];
    alertButton.frame = CGRectMake(220.0, 20.0, 160.0, 40.0);

    [self.tableView addSubview:alertButton];

InfoDark UIButtonがタッチされたときにトリガーしたいアラートメソッドは次のとおりです。

- (void) showAlert {
        UIAlertView *alert = 
         [[UIAlertView alloc] initWithTitle:@"My App" 
                                    message: @"Welcome to ******. \n\nSome Message........" 
                                   delegate:nil 
                          cancelButtonTitle:@"Dismiss" 
                          otherButtonTitles:nil];
        [alert show];
        [alert release];
}

助けてくれてありがとう。

4

3 に答える 3

5

クラッシュの理由:showAlert関数プロトタイプは でなければなりません- (void) showAlert:(id) sender

以下のコードを使用

- (void) showAlert:(id) sender {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"My App" message: @"Welcome to ******. \n\nSome Message........" delegate:nil cancelButtonTitle:@"Dismiss" otherButtonTitles:nil];
        [alert show];
        [alert release];
}

ジェイコブ・レルキンが彼の答えで言っているように:

addTarget へのセレクター引数にコロン (:) が含まれているため、受信セレクターはパラメーターを受け入れる必要があります。パラメータを受け入れるその名前のメソッドがないため、ランタイムはセレクタ @selector(buttonTouched:) を認識しません。この問題を解決するには、タイプ id のパラメーターを受け入れるようにメソッド シグネチャを変更します。

于 2011-05-17T14:56:12.387 に答える
3

Jhaliyaは正しいですが、その理由を簡単に説明します。

ボタンのターゲットを構成するときに、セレクターを次のように定義しました。

@selector( showAlert: )

コロン(:)は、1つの引数を必要とするセレクターのメソッドシグネチャを確立します。-showAlertただし、メソッドは引数をとらないとして定義されているため、オブジェクトは、UIButton呼び出すように指示したメソッドを実際には実装していません。Jhaliyaによって示されるようにメソッドを再定義すると、ボタンターゲットのセレクターが次のように変更されます。

@selector( showAlert )
于 2011-05-17T15:01:21.810 に答える