問題
最近、アプリケーションのインターフェイスをUIPickerView要素で装飾することにしましたが、標準のツールセット、つまり、目的の要素が「選択インジケータ」の下にあるようにスクロールして、何らかのアクションを実行することはできませんでした。 任意の行をクリックすることにより、必要なパラメーターを含むメッセージが送信されるようにする必要がありました。 そのため、UITapGestureRecogniserをねじ込んでUIPickerViewをカスタマイズすることにしました。
解決策
以下に、アクションの順序をステップごとに書き留めます。 UIPickerViewDelegateおよびUIPickerViewDataSourceプロトコルを宣言するUIViewControllerのサブクラスを使用します。
- UITapGestureRecogniserをUIPickerViewに追加します。
UITapGestureRecognizer *tapgesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(whereAreYouTappedOnPicker:)]; [self.pickerView addGestureRecognizer:tapgesture];
viewDidLoad:関数でこのアクションを実行しました。 whereAreYouTappedOnPicker:-これは、ピッカーがクリックされたときに呼び出され、クリックされた行を計算するセレクターです。
- UIViewControllerのサブクラスのヘッダー(.hファイル)でwhereAreYouTappedOnPicker:を宣言します。
-(void)whereAreYouTappedOnPicker:(UIGestureRecognizer *)GestureRecognizer;
- 以前に発表した関数の実装を記述します(これは.mファイルで行います)。
-(void)whereAreYouTappedOnPicker:(UIGestureRecognizer *)gestureRecognizer {
次に、ユーザーがピッカーをスクロールするときと、ユーザーが目的の行をクリックするときの2つのケースを提供する必要があります。 didSelectRow:はコードを使用したスクロールに応答しないため、これが必要です。ここでは、「異なる関数」が必要です。
したがって、2つのイベントがあります。
- ユーザーがピッカーをスクロールすると、didSelectRow:メソッドが呼び出され、customPickerView:メソッドが呼び出され、「選択インジケーター」の下にある行のインデックスがパラメーターとして渡されます。
- ユーザーが目的の行をクリックすると、whereAreYouTappedOnPicker:メソッドが呼び出されます。このメソッドでは、customPickerView:メソッドが呼び出され、押された行のインデックスがパラメーターとして渡されます。
DidSelectRowメソッドのコード:
- (void)pickerView:(UIPickerView *)pickerView didSelectRow: (NSInteger)row inComponent:(NSInteger)component { [self customPickerView:pickerView didSelectRow:row inComponent:component asResultOfTap:NO]; }
- customPickerView関数をヘッダーで宣言します。
-(void)customPickerView:(UIPickerView *)pickerView didSelectRow: (NSInteger)row inComponent:(NSInteger)component asResultOfTap:(bool)userTapped;
- customPickerView関数の実装を.mファイルに記述します。
- (void)customPickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component asResultOfTap:(bool)userTapped { if (userTapped)
問題
ピッカーをすばやくクリックすると、selectedRowが-1になることがあります。 行をクリックすると、新しいビューに切り替えますので、このオプションが適しています。