0

UITableView コントロールの動作を模倣するコントロールを開発しようとしています。次のようにデリゲート プロトコルを定義しました。

@protocol HPSChoiceDelegate

- (void)choiceView:(HPSChoice *)choiceView didSelectChoice:(NSNumber*)selectedIndex;

@end

ユーザーは、メイン コントロール ビュー内のサブビューをタップできます。メイン コントロール ビュー内でメソッドを起動する TapGesture 認識機能を配置しました。これらを次のように配線します。

UITapGestureRecognizer *containerTap = 
        [[UITapGestureRecognizer alloc] initWithTarget:self
                                                action:@selector(didSelectChoice:)];

次に、デリゲートで正しいメソッドを呼び出そうとするメソッドがビューに含まれています。ビューのメソッドは次のようになります。

-(void)didSelectChoice:(UITapGestureRecognizer*)sender
{
    NSNumber* selectedIndex = [NSNumber numberWithInt:sender.view.tag];

    [(id)self.delegate performSelector:@selector(didSelectChoice:) withObject:selectedIndex afterDelay:0.0f];
}

デリゲート コントローラーでは、次のメソッドが定義されています。

- (void)choiceView:(HPSChoice *)choiceView didSelectChoice:(NSNumber*)selectedChoice
{
    NSLog(@"HPSFormController didSelectChoice:(HPSChoice*)choiceView tag = %@",[[choiceView class] description]);
}

それはすべてコンパイルされ、コントロールをタップすると、ビューで didSelectChoice が呼び出され、デリゲートのメソッドが呼び出されます。ただし、デリゲート メソッドは次のエラーでクラッシュします。

-[HPSFormController didSelectChoice:]: unrecognized selector sent to instance 0x29b4e0

これを修正するにはどうすればよいですか? どうもありがとう。

4

3 に答える 3

1

呼び出しているため、メソッドがクラッシュしています

didSelectChoice:

一方、定義したメソッドは

choiceView:didSelectChoice:

次のように呼び出すことでこれを修正できると思います。

[(id)self.delegate performSelector:@selector(choiceView:didSelectChoice:) withObject:choiceView withObject:selectedIndex];

もちろん、didSelectChoice: メソッドで choiceView を取得する必要があります。

于 2012-09-07T12:47:23.290 に答える
1

たとえば、ビューが と呼ばれる場合、HPSChoiceViewそのデリゲートはそのビューを作成するコントローラーであると言う必要もあります。

たとえば、デリゲート コントローラー内のどこか (HPSFormControllerだと思います) で、次のことを行う必要があります。

HPSChoiceView* choiceView = // alloc-init here
// self refers to an instance of HPSFormController at run-time
choiceView.delegate = self;

これは、そのビューでタップするたびに、デリゲートとして設定されているため、コントローラーがそのタップに応答することを意味します。

さらに、間違ったセレクターを呼び出しています。呼び出す代わりに

[self.delegate performSelector:@selector(didSelectChoice:) withObject:selectedIndex afterDelay:0.0f];

電話

[self.delegate performSelector:@selector(choiceView:didSelectChoice:) withObject:choiceView withObject:selectedIndex];

choiceViewから取得できますsender.viewsenderのインスタンスでUITapGestureRecognizerあり、このため、タップされたビューを取得できます。

セレクターとは何かを理解するには、Objective CおよびApple docのセレクターを参照してください。

そうは言っても、デリゲートのセレクターも変更しますHPSChoiceDelegate。したがって、たとえば、(わかりやすくするために)次のように呼びます。

- (void)didSelectChoiceView:(HPSChoice *)choiceView withSelectedIndex:(NSNumber*)selectedIndex;

これを使用すると、セレクターは になりますdidSelectChoiceView:withSelectedIndex:。コロンに注目!!

さらに、@Cirille で提案されているように、デリゲート メソッドを呼び出す前にコントロールを追加します。そのコントロールにより、デリゲートを設定したかどうか (私の回答の最初の部分) を確認でき、デリゲートは正しく実装されているため、そのセレクターに応答できます。

それが役立つことを願っています。

于 2012-09-07T12:45:50.293 に答える
0

デリゲートとして機能するクラスは、プロトコルを宣言して準拠する必要があり、自分自身を「っぽいクラス」HPSChoiceDelegateのデリゲートとして登録する必要もあります。UITableView

また、 に変更してみてください@selector(choiceView:didSelectChoice:)

于 2012-09-07T12:46:46.660 に答える