2014-11-10 2 views
0

하나의 ViewController에서 사용하는 3 개의 UIPickerView가 있습니다. 그것은 각각에서 결과를 저장할 필요가 있기 때문에 그것은 서로 독립적이어야하지만 내가 그것을 실행할 때 당신이 다른 UIPickerView를 선택할 때도 같은 결과를 저장하는 세 개의 pickerView를 볼 수 있습니다. ViewController.m 파일 :하나의 ViewController에 3 개의 UIPickerViews

@interface ViewController(){ 
NSArray *_pickerData; 
NSArray *_pickerData2; 
NSArray *_pickerData3; 

__weak IBOutlet UITextField *max; 
__weak IBOutlet UITextField *m2; 
__weak IBOutlet UITextField *m3; 
} 
@end 

@implementation ViewController 


    - (void)viewDidLoad { 
    [super viewDidLoad]; 
_pickerData = @[@"Apple",@"Avocado",@"Asparagus",@"Grapefruit"]; 
    _pickerData2 = @[@"Apple",@"Avocado",@"Asparagus",@"Grapefruit"]; 
    _pickerData3 = @[@"Apple",@"Avocado",@"Asparagus",@"Grapefruit"]; 
// Do any additional setup after loading the view, typically from a nib. 
self.picker.dataSource = self; 
self.picker.delegate = self; 
self.picker2.dataSource = self; 
self.picker2.delegate = self; 
self.picker3.dataSource = self; 
self.picker3.delegate = self; 
} 

- (void)didReceiveMemoryWarning { 
[super didReceiveMemoryWarning]; 
// Dispose of any resources that can be recreated. 
} 
// The number of columns of data 
- (int)numberOfComponentsInPickerView:(UIPickerView *)pickerView 
{ 
return 1; 
} 

// The number of rows of data 
- (int)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component 
{ 
return _pickerData.count; 
    } 
    - (int)picker2View:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component 
    { 
return _pickerData2.count; 
    } 
    - (int)picker3View:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component 
    { 
return _pickerData3.count; 
    } 
- (NSString*)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:   (NSInteger)component      
    { 
    self->max.text = [NSString stringWithFormat:@"%@", _pickerData[row]]; 

    return _pickerData[row]; 

    } 
    - (NSString*)pickerView2:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent: (NSInteger)component 
    { 
    self->m2.text = [NSString stringWithFormat:@"%@", _pickerData2[row]]; 
    return _pickerData2[row]; 
     } 
    - (NSString*)pickerView3:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent: (NSInteger)component 
     { 
     self->m3.text = [NSString stringWithFormat:@"%@", _pickerData2[row]]; 
     return _pickerData3[row]; 
     } 
     @end 

내가 세 PickerView 작업 one.ViewController.h 파일처럼 실행 피커의 모든 동일 전화를받을

 #import <UIKit/UIKit.h> 

     @interface ViewController : UIViewController<UIPickerViewDataSource, UIPickerViewDelegate> 
     @property (weak, nonatomic) IBOutlet UIPickerView *picker; 
     @property (weak, nonatomic) IBOutlet UIPickerView *picker2; 
     @property (weak, nonatomic) IBOutlet UIPickerView *picker3; 
     @end 

답변

1

pickerView : (UIPickerView *) pickerView numberOfRowsInComponent : (NSInteger) 구성 요소를 구현할 필요가 없습니다. 사용자가 TextField를 탭할 때 UIPickerView를 가져와야하는 3 개의 텍스트 필드가 있다고 가정합니다. 3 가지 다른 UIPickerViews가 필요하지 않습니다.

Bool firstTextFieldActive, Bool secondTextFieldActive, Bool thirdTextFieldActive는 모두 viewDidLoad에서 기본값 "NO"로 설정합니다.

사용자가 특정 텍스트 필드에 도청되면

는 각각 부울 설정 "YES"

예를 들면 다음과 사용자가 "MAX"다음이 "컴파일러 걸기 (BOOL) textFieldShouldBeginEditing에 도청 말하게 :(의 UITextField *)에 textField "여기에 당신은 또한 당신의

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

    if(firstTextFieldActive){ 
     return _pickerData.count; 
    }else if(secondTextFieldActive){ 
     return _pickerData2.count; 
    }else if(thirdTextFieldActive){ 
     return _pickerData3.count; 
    } 
} 

이 후 다음 코드

-(BOOL)textFieldShouldBeginEditing:(UITextField *)textField 
{ 
    if([textField isEqual: max]){ 

     //First textfield is being edited 
     firstTextFieldActive = YES; 
     //Make sure the other textfield actives are set to NO 
     secondTextFieldActive = NO; 
     thirdTextFieldActive = NO; 
     //Now reload pickerView 
     [picker reloadAllComponents]; 
    } 
} 

로 편집되고있는 텍스트 필드를 확인합니다 O 할수 있답니다 만이

-(NSString*)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component      
{ 
    if(firstTextFieldActive){ 
     self->max.text = [NSString stringWithFormat:@"%@", _pickerData[row]]; 

     return _pickerData[row]; 
    }else if(secondTextFieldActive){ 
     self->m2.text = [NSString stringWithFormat:@"%@", _pickerData2[row]]; 
     return _pickerData2[row]; 
    }else if(thirdTextFieldActive){ 
     self->m3.text = [NSString stringWithFormat:@"%@", _pickerData2[row]]; 
     return _pickerData3[row]; 
    } 
} 

희망 중 하나를 구현이 당신은 위임 방법을 반복 한

2

대리인 및 데이터 소스 방법을 조회수. 차이점은 메서드에 전달 된 pickerView 인수에 있습니다. 따라서, 예를 들어, 대신 :

- (int)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component 
{ 
    return _pickerData.count; 
} 
- (int)picker2View:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component 
{ 
    return _pickerData2.count; 
} 
- (int)picker3View:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component 
{ 
    return _pickerData3.count; 
} 

당신이 있어야합니다 그래서 다른 모든 위임/데이터 소스 방법에 대한

- (int)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component 
{ 
    if (pickerView == self.picker) { 
     return _pickerData.count; 
    } else if (pickerView == self.picker2) { 
     return _pickerData2.count; 
    } else if (pickerView == self.picker3) { 
     return _pickerData3.count; 
    } 
} 

그리고있다.

0

하는 데 도움이 - 그건하지 위임 방법이 작동하는 방법. 위의 6 가지 방법 중 실제로 작동하는 유일한 방법은 각 그룹의 첫 번째 방법입니다.이 방법은 UIPickerView에서 호출 할 실제 대리인 메서드입니다. 다른 사람들은 결코 타격을 입지 않을 것입니다. 그것이 모두가 똑같이 행동하는 것처럼 보입니다.

대리자 메서드에 전달 된 pickerView 인수는 이미 3이라는 것을 알려줍니다. 메서드에 전달 된 값과 viewController의 .h에서 선언 한 @property를 비교하여 pickerView를 가져와야합니다. 또한 그들은 아마도 .h에있을 필요가 없습니다.

//The following is the only one of the 3 "titleForRow" methods that's working 
- (NSString*)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:   (NSInteger)component      
    { 
    //...result is that they're all set to the same array value Don't use the following line. 
    //self->max.text = [NSString stringWithFormat:@"%@", _pickerData[row]]; 

    //use this instead to determine which UIPicker the argument `pickerView` refers to 
    if (pickerView == self.picker) { 
    return _pickerData[row]; //this assumes the data array has an NSString value for this row. What if it doesn't? 
    } else if ... //looks like pbasdf already mentioned this approach above... Account for the 3 options 

    return nil; //after all the if/else branches, in case pickerView or row are nil, since you have to return something 
} 


- (int)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component 
{ 
    //check the "pickerView" argument against your @properties. @pbasdf beat me to it! 
    //Same if/else check as the other delegate methods 
    //then return the correct _pickerData.count; // 
    } 
관련 문제