2012-09-07 2 views
1

Xcode 4.4에서 피커 뷰에 문제가 있습니다. 1 배열에 여러 배열을 채우고 싶습니다. 나는 많은 수의 튜토리얼을 보았고 거의 읽을 수 있었다.UIPickerView - 여러 배열로 1 피커 채우기

* .H

#import <UIKit/UIKit.h> 

@interface PickerView : UIViewController 

<UIPickerViewDataSource,UIPickerViewDelegate> 
{ 
    IBOutlet UIPickerView *picker; 

    NSMutableArray *array_1; 
    NSMutableArray *array_2; 
} 

@property (strong, nonatomic) IBOutlet UIView *pickerContainer; 
@property (strong, nonatomic) IBOutlet UITextField *textfield_1; 
@property (strong, nonatomic) IBOutlet UITextField *textfield_2; 

- (IBAction)showArray_1Picker:(id)sender; 
- (IBAction)showArray_2Picker:(id)sender; 
- (IBAction)hidePicker:(id)sender; 

@end 

*하는 .m

#import "PickerView.h" 

@interface PickerView() 

@end 

@implementation PickerView 
@synthesize pickerContainer; 
@synthesize textfield_1; 
@synthesize textfield_2; 

int textFieldTouched = 0; 

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

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent (NSInteger)component 
{ 
    switch(textFieldTouched) 
    { 
     case 1: 
      return [array_1 count]; 
      break; 
     case 2: 
      return [array_2 count]; 
      break; 
     default: 
      return 0; 
    } 
} 


- (NSString *)pickerView:(UIPickerView *)picker titleForRow:(NSInteger)row forComponent:(NSInteger)component 
{ 
    switch(textFieldTouched) 
    { 
     case 1: 
      return [array_1 objectAtIndex:row]; 
      break; 
     case 2: 
      return [array_2 objectAtIndex:row]; 
      break; 
     default: 
      return @"nothing"; 
    } 
} 

- (void) pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component 
{ 
    switch(textFieldTouched) 
    { 
     case 1: 
      textfield_1.text = [array_1 objectAtIndex:[pickerView selectedRowInComponent:0]]; 
      break; 
     case 2: 
      textfield_2.text = [array_2 objectAtIndex:[pickerView selectedRowInComponent:0]]; 
      break; 
    } 
} 

- (void)viewDidLoad 
{ 
    array_1 = [[NSMutableArray alloc] init]; 
    [array_1 addObject:@"1"]; 
    [array_1 addObject:@"2"]; 
    [array_1 addObject:@"3"]; 
    [array_1 addObject:@"4"]; 
    [array_1 addObject:@"5"]; 

    array_2 = [[NSMutableArray alloc] init]; 
    [array_2 addObject:@"a"]; 
    [array_2 addObject:@"b"]; 
    [array_2 addObject:@"c"]; 
    [array_2 addObject:@"d"]; 
    [array_2 addObject:@"e"]; 

    pickerContainer.frame = CGRectMake(0, 460, 320, 261); 

    [super viewDidLoad]; 
} 

- (void)viewDidUnload 
{ 
    [self setPickerContainer:nil]; 
    [self setTextfield_1:nil]; 
    [self setTextfield_2:nil]; 
    [super viewDidUnload]; 
} 

- (IBAction)showArray_1Picker:(id)sender 
{ 
    [textfield_1 resignFirstResponder]; 
    textFieldTouched = 1; 
    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationDuration:0.3]; 
    pickerContainer.frame = CGRectMake(0, 200, 320, 261); 
    [UIView commitAnimations]; 
} 

- (IBAction)showArray_2Picker:(id)sender 
{ 
    [textfield_2 resignFirstResponder]; 
    textFieldTouched = 2; 
    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationDuration:0.3]; 
    pickerContainer.frame = CGRectMake(0, 200, 320, 261); 
    [UIView commitAnimations]; 
} 

- (IBAction)hidePicker:(id)sender 
{ 
    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationDuration:0.3]; 
    pickerContainer.frame = CGRectMake(0, 460, 320, 261); 
    [UIView commitAnimations]; 
} 

@end 

그래서 난이 주요 문제가있어 : 내가 textFieldTouched = 0을 설정하면

  1. 을 (이것은 내 코드입니다 또는> 2) 내 픽커가 나타나기 전에 내가 그랬던 것처럼 나타납니다. 어쨌든 다시 숨기면 해당 배열의 첫 번째 값을 텍스트 필드에 씁니다.

  2. textFieldTouched = 1 또는 = 2로 설정하면 편집하려는 텍스트 필드에 상관없이 피커에 관련 배열이 채워집니다. 그러나 내가 내 시야에서 피커의 값을 스크롤하면 뒤로 스크롤 할 때 값이 변경됩니다. 내가 텍스트 필드 2를 터치하면 피커 배열로 채워 나타 난 텍스트 필드 1을 터치하면

    피커 배열 1

    와 인구가 나타납니다 :

나는 이런 식을 갖고 싶어 2

ans so.

도와 드릴 수 있습니까?

더 잘 볼 수 있도록 코드를 업로드했습니다.

https://dl.dropbox.com/u/5858884/ProblemCode.zip

P.S.

영어 때문에 실수를 용서하시기 바랍니다 내 어머니의 언어가 아닙니다)

u는 내 문제에 속하는 나던 내 코드에서 뭔가 잘못을 찾을 그래서 만약 내가 2 주 전에 프로그래밍 시작 내가 더 잘받을 수 있도록 말씀 해주십시오 :) 당신의 showArray1Picker 및 showArray2Picker 방법에서

답변

2

이 줄을 추가 :

[picker reloadAllComponents]; 

이 발생합니다 데이터를 다시로드 할 수있는 선택기를. 또한 IBOutlet, 피커를 IB의 피커보기에 연결해야합니다. 연결되어 있지 않은 것으로 나타났습니다.

+0

완벽한 답변 주셔서 감사합니다.) 방법이 있습니까? 피커를 열면 항상 1 행에서 시작됩니까? –

+0

한 피커에서 다른 피커로 전환 할 때 피커가 1 번 라인에 있다는 것을 의미합니까? – rdelmar

+0

나는 이렇게하고 싶다. 지금 내가 세 번째 줄을 선택하면 피커를 숨기고 다른 줄로 다시 표시합니다. –