1

私はアプリケーションを開発しています。1つの要件があります。つまり、着信コールがある場合、対応するメソッドが呼び出されます。alertviewコードを記述します。これは完全に機能し、alertviewを表示します。

Alertviewには、承認と拒否の2つのボタンが含まれています。これらのボタンのいずれかをクリックすると、alertviewデリゲートメソッドは呼び出されません。

+ (void)incomingCallAlertView:(NSString *)string
{
    UIAlertView *callAlertView=[[UIAlertView alloc] initWithTitle:string message:@""   delegate:self cancelButtonTitle:@"reject" otherButtonTitles:@"accept",nil];
    [callAlertView show];
}

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{

    NSLog(@"clickedButtonAtIndex");

    if(buttonIndex==0)
    {
          NSLog(@"buttonindex 0");
    }
    else
    {
          NSLog(@"buttonindex 1");
    }

}

+(void)incomingcallメインスレッドを使用して別のメソッドからメソッドを呼び出しています。

- (void)showIncomingcalling
{
     [CallingViewController performSelectorOnMainThread:@selector(incomingCallAlertView:)      withObject:@"on_incoming_call" waitUntilDone:YES];
}

私はクラスでプロトコルを記述します。つまり<UIAlertViewDelegate>、デリゲートメソッドが呼び出されないため、事前に問題を解決できます。

4

1 に答える 1

19
initWithTitle:string message:@"" delegate:self
                                           ^^
                                      Here it is!

クラスメソッドのコンテキストではself、オブジェクトのインスタンスではなく、クラス自体を参照します(クラスメソッドはクラスのインスタンスをどのように認識しますか?)。したがって、incomingCallAlertView:メソッドをインスタンスメソッドにするか(つまり、プラス記号の代わりにマイナス記号を付けて、メソッドself内のクラス名の挿入を呼び出すshowIncomingCalling)、またはクラスメソッドであるかのようにデリゲートメソッドを実装する必要があります。

+ (void)alertView:(UIAlertView *)av clickedButtonAtIndex:(NSInteger)index

(これ、クラスオブジェクト自体がそのメタクラスのインスタンスであるため機能します。つまり、クラスメソッドは実際にはメタクラスの単なるインスタンスメソッドです。)

ちなみに、まともなObjective-Cチュートリアルや言語リファレンスを注意深く読んでください。この質問は、他のリソースで検索されないためには基本的すぎるため、ここで尋ねるべきではありませんでした。

于 2012-10-12T12:32:51.927 に答える