8

1 つのビューに 8 つのテキストフィールドがあります。ピッカービューを使用してそれぞれにデータを入力したい。異なるテキストフィールドの異なる配列から異なるアイテムのリストを表示するピッカービューを 1 つ持つことはできますか?

サンプルコードを使用してプログラムで行う方法を誰かが説明できますか?

また、ビューがロードされたときにピッカービューを非表示にするにはどうすればよいですか?対応するデータリストでテキストフィールドをクリックしたときにのみ表示されますか? データを選択すると消え、対応するデータリストなどを含む別のテキストフィールドをクリックすると再び表示されます。

私はxcodeが初めてです。どんな助けでも大歓迎です。ありがとうございました。

4

4 に答える 4

11

条件によって異なるデータを表示する PickerView は 1 つしか使用できません。

私の考えは次のとおりです。たとえば、8 つの異なる配列を作成できます。インターフェイスでそれらを NSArray として宣言し、viewDidLoad で初期化します。

array1st = ...
array2nd = ...
array3d = ...
//and until 8.

次に、それを埋める必要がある配列を指すためだけに別のものを作成し(のようにNSArray *currentArray)、それを初期化する必要さえありません=正しい配列を指すためだけに使用されます。

したがって、UITextFields のデリゲートをビュー コントローラーに設定し、メソッドtextFieldShouldBeginEditingで UITextField が誰であるかを確認し、正しい配列を currentArray として割り当て、UIPickerView を でリロードし、同じメソッドreloadDataで NO を返す必要があります。textFieldShouldBeginEditingcurrentTextField は、現在の UITextField が「編集」されているものを知るためだけのポインターです。ピッカーでデータを選択した後にテキストを設定できるように、それを保存する必要があります。インターフェイスで currentTextField を宣言します。

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
    currentTextField = textField;
    if (textField == myFirstTextView)
    {
        currentArray = array1st;
        [pickerView reloadData];
        [self animatePickerViewIn];
        return NO;
    }
    //and this way until 8th
}

したがって、実際にはUIPickerViewDelegateであるView Controllerの場合、現在の配列に従ってUIPickerViewを設定し、何も変更する必要はありません.currentArrayを配列として使用してデータを取得します.

次に、pickerView を表示します。

IBOutlet を接続した後、viewDidLoad で次の 2 つのことを行う必要があります。UIPickerView のフレームを設定し、それをサブビューとして追加します。

pickerView.frame = CGRectMake(0,self.view.frame.size.height, pickerView.frame.size.width, pickerView.frame.size.height);
pickerView.delegate = self;
pickerView.dataSource = self;
//or you can do it via Interface Builder, right click the pickerView and then connect delegate and dataSource to the file's owner
[self.view addSubview:pickerView];

animatePickerViewInここで、ユーザーが UITextField をタップしたときに呼び出される というメソッドを作成する必要があります。

-(void)animatePickerViewIn
{

    [UIView animateWithDuration:0.25 animations:^{
        [pickerView setFrame:CGRectMake(0, pickerView.frame.origin.y-pickerView.frame.size.height, pickerView.frame.size.width, pickerView.frame.size.height)];
    }];
}

pickerView にデータをロードするには:

-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{

    return [currentArray count];
}


-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
    return 1;
}

-(NSString*)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
    return [currentArray objectAtIndex:row];
}

ユーザーが pickerView で行を選択すると、それをデリゲート メソッドとして受け取ります。したがって、currentTextField のテキストを選択した値として設定するだけです。

-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
    //and here you can do in two ways:
    //1
    [currentTextField setText:[currentArray objectAtIndex:row]];
    //2
    [currentTextField setText:[self pickerView:pickerView titleForRow:row inComponent:component]];
}
于 2012-07-23T12:37:49.860 に答える
1

これを使って。

 - (void)textFieldDidBeginEditing:(UITextField *)textField{
   MyPickervie.delegate=self;
 }
 - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)myLocationPickerView;
{
  return 1;
 }

-(void)myLocationPickerView:(UIPickerView *)myLocationPickerView didSelectRow:           (NSInteger)row inComponent:(NSInteger)component;
 {

    switch(textfield.tag){
     Case 0:
            label.text=[arraNo objectAtindex:row];
            break;
     default: break;
  }
 }
 -(NSInteger)myLocationPickerView:(UIPickerView *)myLocationPickerView  numberOfRowsInComponent:(NSInteger)component;
{

switch(textfield.tag){
     Case 0:
            return [arrayNo count];
            break;
     default: break;
  }
}

-(NSString *)myLocationPickerView:(UIPickerView *)myLocationPickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component;
 {
   switch(textfield.tag){
     Case 0:
            return [arrayNo objectAtIndex:row];
            break;
     default: break;
  }

}

別の配列を呼び出して pickerView に設定するには、スイッチ条件で 8 つのケースを使用する必要があります。

于 2012-07-23T12:50:08.943 に答える
1

このコードを 3 つのテキストフィールドでテストしました。

そして、あなたの問題の完璧な解決策を見つけました。

1) グローバル UITextField を 1 つ取得します。

2) テキストフィールド編集のデリゲートメソッドで、グローバルテキストフィールドを現在のテキストフィールドに設定します。

3) ピッカー値変更メソッドで、グローバル テキスト フィールドのテキストを設定すると、選択したテキスト フィールドの値が変更されます。

以下のコードは正常に動作しています。

コーディングをお楽しみください。

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)thePickerView 
{
return 1;
}

- (NSInteger)pickerView:(UIPickerView *)thePickerView numberOfRowsInComponent:(NSInteger)component 
{   
return 10;
}

- (NSString *)pickerView:(UIPickerView *)thePickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component 
{
return [NSString stringWithFormat:@"Test %d",row + 1];

}

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

test.text = @"XYZ";

}

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
test = textField;

return YES;
}

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{    
[textField  resignFirstResponder];

return YES;
}
于 2012-07-23T12:52:52.067 に答える
0

1. PickerView を非表示にする Done barButtonItem で toolBar を使用します。

2. textFields に次のような tagValues を指定します。textFiled1.tag=100;次に、このタグ値を使用して pickerView 配列にデータを入力します。

3. ユーザーが pickerView から任意の値を選択すると、デリゲート メソッドに次のように記述します。

if(textField.tag== @"Your Tag Value")
{  
      textField.text=[pickerArray objectAtIndex:row];
}

解決策の要点がわかったので、自分でコードを試すことができると思います.Good Luck!!

于 2012-07-23T12:35:33.747 に答える