2010-12-07 3 views
2

私はUITableViewの選択された行に基づいて作成されたUIPickerViewでUIをセットアップしようとしています。基本的には、Calendarアプリケーションでイベントを追加するために、開始&終了画面に表示されるのと同じUIです。UIPickerViewモーメントアニメーションをキャンセルすることができますか?

http://raoli.com/files/uipicker.png

私は...それようピッカーが選択に基づいて取り込まれ、適切私のモデルを更新しますほとんどの時間を自分のデータソースとデリゲートのセットアップを持っています。

誰かがピッカービューをフリックした後、テーブルビューに変更があった場合、UIPickerViewDelegateは元の選択ではなく、テーブルビューの新しい選択に対して変更を記録しようとします。明らかに私のコードでこれがどうして起こるのか、私はより良い振る舞いをするために私の考えを改めましたが、私はAppleがUIで何をしているのか分かりました。

ピッカーをフリックしてピッカーの回転が完了するまでの時間を切り替えると、回転は直ちに停止し、ピッカーは新しいタイプの値に更新され、元のタイプの時間は変更されません。私はアニメーションをキャンセルする方法を見ていないが、私は間違っている可能性があります。私は人生が楽になるので間違っていることを願っています。

私が見ることのできるもう1つの選択肢は、各属性ごとに異なるUIPickerViewsで、それらを切り替えることです。つまり、Appleの例では2つのUIPickerViewインスタンスがあることは明らかです。それだけで完了する必要がある他の作業が作成され、最小限のビューでそれを実行する方法があるかどうかが分かりました。

更新アーロンのアイデアはいくつかの約束を示したが、メッセージはピッカーが現在アニメーション化された主かどうか、ピッカーの状態に基づいて、デリゲートに配信を取得する方法についてのエッジケースの数があるように見えます。ピッカーが現在(公開API経由で)回転しているかどうかを判断する方法がないように思われるため、可能な設定を回避しようとすると問題が発生したようです。私は、選択した属性が変更されたときにピッカーの可視性を切り替えること、そして現在隠されているUIPickerViewインスタンスからのデリゲートメッセージを無視して、複数のピッカーを使用することになりました。

答えて

3

私は

- (void)selectRow:(NSInteger)row inComponent:(NSInteger)component animated:(BOOL)animated 

は良い候補になると思います。 animatedNOの場合は、移動せずにすぐに表示する必要があります。

データが設定されていると判断したら、ピッカービューのメソッドを呼び出してその設定を反映させます。現在のアニメーションや慣性効果をオーバーライドし、デリゲートにdidSelectRow:を受け取れないことが期待されます。もしそうなら、それを無視する必要があるかもしれません。

+0

良いアイデアは、それを考えていないが、残念ながらバットからのトリックをやっていないようだ。 'pickerView:didSelectRow:inComponent:'のように見えますが、実際には 'row'として渡された値を取るのではなく、スピナーから値を取得します。したがって、私が0を渡しても、私のUIPickerDelegateは、 'didSelectRow:'デリゲートメソッドを呼び出すときに値として13のようなものを取得します。 しかし、サブクラスを介してこれを修正する可能性があります。ありがとう! – Jablair

+0

私は混乱しています - あなたはスピナーを設定するためにselectRowまたはdidSelectRowを試しましたか? –

+0

私は 'selectRow:inComponent:animated'を呼び出してスピナーを設定しました。このスピナーは、UIPickerViewデリゲートメソッド' pickerView:didSelectRow:inComponent: 'を呼び出したものです。 – Jablair

関連する問題