22

私は とUIPickerView一緒UIViewに を持っていUITextFieldます。ユーザーがピッカーから値を選択するか、テキスト フィールドにカスタム値を入力できるようにしています。

ユーザーがピッカーから任意のオプションを選択すると、変数値が ( pickerView:didSelectRow:inComponent:) メソッドで細かく変更されます。ただし、ユーザーがピッカーで値を選択しない場合 (既に選択されている最初のオプションを選択したい場合)、このメソッドは呼び出されず、選択は変数に反映されません。

変数のデフォルト値をピッカーの最初のオプションに設定してみました。ただし、その場合、ユーザーがテキスト フィールドを編集すると、変数にはテキスト フィールドのテキストが含まれます。ユーザーが最初の値を再び選択することにした場合、新しい値は変数に反映されません。

どうすればこれを克服できますか?ありがとう。

関連するコードは次のとおりです

私の場合、デフォルトでピッカーの最初のオプションviewDidLoadを設定するこのステートメントがありますselectText

[self setSelectText:[myArray objectAtIndex:0]];

textFieldShouldReturn

- (BOOL)textFieldShouldReturn:(UITextField *)txtField{
    [txtField resignFirstResponder];
    [self setSelectText:txtField.text];
    return YES;
}

PickerViewDelegate の didSelectRow

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
    // report the selection to the UI label
    [self setSelectText:[myArray objectAtIndex:[pickerView selectedRowInComponent:0]]];
}

問題は、ユーザーがテキストを編集した後、結局ピッカーの最初の値を使用したいと判断したときに発生します。その場合、彼らはキーボードを閉じて、ピッカーの最初のオプション (すでに選択されています) をクリックします。このアクションは呼び出さdidSelectRowれないため、selectText の値は変更されません。

ユーザーが の値を変更できるようにするにはselectText、まずピッカーから他の値を選択し、次に 1 行目を選択する必要があります。

4

5 に答える 5

27

このコードで選択を行うたびにピッカーの値を「プッシュ」する代わりに、次のようにします。

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component

次のようなものを使用して、ユーザーがボタン(または使用している他のイベント)をクリックしたときに「プル」する必要があります。

- (void)myAction:(id)sender
{

    NSInteger row = [myPicker selectedRowInComponent:0];
    selectedText = [myArray objectAtIndex:(NSUInteger)row];


}

テキストをクリアする場合:UITextFieldクラスには、現在のテキストをクリアするための組み込みボタンがあります。したがって、ユーザーがそのテキストを望まない場合は、それを破棄できます。

myTextField.clearButtonMode = UITextFieldViewModeAlways; 

したがって、スクリプトでは、に値があるかどうかを確認しますか。TextField値がある場合はTextFieldを使用し、値がない場合はから情報を取得しますPicker

于 2009-04-25T20:06:54.850 に答える
3
-(void)textFieldDidBeginEditing:(UITextField *)textField
{
    // Only for the text field with the picker
    if (textField == self.yourTextField && [textField length]!=0)
    {
        // Select the first row programmatically 
        [self.categoriesPicker selectRow:0 inComponent:0 animated:YES];
        // The delegate method isn't called if the row is selected programmatically
        [self pickerView:self.categoriesPicker didSelectRow:0 inComponent:0];
    }



}

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
    //Do all the stuff to populate the TextField
}
于 2015-02-03T11:55:49.030 に答える
2

UIPickerViewをインスタンス化した直後に、プログラムで行を選択できますか?

int firstRow = 0;
int firstOptionIndex = 0;
[myPickerView selectRow:firstRow inComponent:firstOptionIndex animated:NO];

その最後の行は、pickerView:didSelectRow:inComponentデリゲートメソッドをトリガーします。

言い換えれば、それはあなたがそれを保存しているところならどこでも、変数の値を設定するべきです(NSArray?明確ではありません)。

于 2009-04-25T19:57:54.730 に答える
0

ユーザーがリストの最初の項目を選択したときに、UIPickerView で didSelectRow が呼び出されない問題を解決するには、UITapGestureRecognizer を使用できます。(Swift でのコード例)

self.txtTransType = self.makeTextField(self.transType, placeHolder: "Check-in or Check-out")
self.txtTransType?.addTarget(self, action: "txtTransTypeEditing:", forControlEvents: UIControlEvents.EditingDidBegin)

func makeTextField(text: String?, placeHolder: String) -> UITextField {
    var textField = UITextField(frame: CGRect(x: 140, y: 0, width: 220.00, height: 40.00));
    textField.placeholder = placeHolder
    textField.text = text
    textField.borderStyle = UITextBorderStyle.Line
    textField.secureTextEntry = false;
    textField.delegate = self
    return textField
}

func txtTransTypeEditing(sender: UITextField) {
    var ttPickerView:UIPickerView = UIPickerView()
    ttPickerView.dataSource = self
    ttPickerView.delegate = self
    sender.inputView = ttPickerView

    let recognizer = UITapGestureRecognizer(target: self, action:Selector("handleTransTypePickerTap:"))
    recognizer.delegate = self
    ttPickerView.addGestureRecognizer(recognizer)
}

func handleTransTypePickerTap(recognizer: UITapGestureRecognizer) {
    let ttPickerView = recognizer.view as! UIPickerView
    let row = ttPickerView.selectedRowInComponent(0)
    self.txtTransType!.text = self.transTypeData[row]
}

次のリンクUIGestureRecognizer Tutorial: Getting Startedを使用してタップ認識機能を動作させます (UIGestureRecognizerDelegate を追加する必要があります) と次のコード

class TransactionViewController: UIViewController, UITextFieldDelegate,UIPickerViewDataSource,UIPickerViewDelegate, UIGestureRecognizerDelegate  { }

func gestureRecognizer(UIGestureRecognizer,
    shouldRecognizeSimultaneouslyWithGestureRecognizer:UIGestureRecognizer) -> Bool {
        return true
}
于 2015-06-18T07:23:48.113 に答える