동일한 보기에서 둘 이상의 UIPickerView를 어떻게 프로그래밍할 수 있나요?
-
13-12-2019 - |
문제
키보드 대신 UIPickerViews를 표시하기 위해 textFields inputView 속성을 사용하고 있습니다.프로그래밍한 방식에서는 .H 파일에서 PickerViews를 선언하지 않거나 인터페이스 빌더의 뷰에서 연결하지 않습니다.pickerview의 속성을 구현할 때 각 속성을 서로 다른 속성으로 만들 수 없습니다.다음과 같이 어떤 선택기가 사용되는지에 따라 다른 속성을 갖도록 "if" 문을 사용해 보았습니다....
-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)agePickerView {
if ([pickerView isEqual: agePickerView]){
return 1;
}
if ([pickerView isEqual: weightPickerView]){
return 1;
}
}
하지만 이렇게 하면 WeightPickerView가 선언되지 않았다는 메시지가 표시됩니다.PickerView를 구현하기 위한 코드는 다음과 같습니다.
@implementation MainViewController
//WEIGHT FIELD CODE
-(IBAction)weightFieldDidBeginEditing{
UIPickerView *weightPickerView = [[UIPickerView alloc] init];
weightField.inputView = weightPickerView;
weightPickerView.showsSelectionIndicator = YES;
weightPickerView.delegate = self;
weightPickerView.dataSource = self;
[weightPickerView release];
UIToolbar *weightToolBar = [[UIToolbar alloc] initWithFrame:CGRectMake(0,0,320,44)];
UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(pickerDoneClicked:)];
[weightToolBar setItems:[NSArray arrayWithObject:doneButton] animated:NO];
weightField.inputAccessoryView = weightToolBar;
}
-(NSInteger)weightpickerView:(UIPickerView *)weightPickerView numberOfRowsInComponent: (NSInteger)component{
return [weightPickerArray count];
}
-(NSString *)weightpickerView:(UIPickerView*)weightPickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
return [weightPickerArray objectAtIndex:row];
}
// AGE FIELD CODE
-(IBAction)ageFieldDidBeginEditing{
UIPickerView *agePickerView = [[UIPickerView alloc] init];
ageField.inputView = agePickerView;
agePickerView.showsSelectionIndicator = YES;
agePickerView.delegate = self;
agePickerView.dataSource = self;
[agePickerView release];
UIToolbar *ageToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0,0,320,44)];
UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(pickerDoneClicked:)];
[ageToolbar setItems:[NSArray arrayWithObject:doneButton] animated:NO];
ageField.inputAccessoryView = ageToolbar;
}
-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)agePickerView {
return 1;
}
-(NSInteger)pickerView:(UIPickerView *)agePickerView numberOfRowsInComponent: (NSInteger)component {
return [agePickerArray count];
}
-(NSString *)pickerView:(UIPickerView*)agePickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
return [agePickerArray objectAtIndex:row];
}
-(void)pickerView:(UIPickerView *)agePickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{
ageField.text = (NSString *) [agePickerArray objectAtIndex:row];
}
-(void)pickerDoneClicked:(id)sender{
[ageField resignFirstResponder];
[weightField resignFirstResponder];
}
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
[super viewDidLoad];
agePickerArray = [[NSMutableArray alloc] init];
for (int age=1; age<=100; age++) {
NSString *ageString = [NSString stringWithFormat:@"%d%",age];
[agePickerArray addObject:ageString];
weightPickerArray = [[NSMutableArray alloc] init];
for (int weight = 50; weight<=500; weight++) {
NSString *weightString = [NSString stringWithFormat:@"%d%",weight];
[weightPickerArray addObject:weightString];
}
}
제가 하려는 일을 다른 방법으로 할 수는 없을까요? 그 방법으로는 작동하지 않거든요...그리고 각 선택기 보기에 대한 구현을 다시 실행하려고 하면 "...""numberOfRowsInComponent"" 또는 내가 수행 중인 다른 속성 오류가 발생합니다.도와주세요. 어떻게든 .H 파일에서 pickerViews를 변경하고 선언해야 하더라도 이 작업을 수행할 수 있는 한 무엇을 해야 하는지 상관하지 않습니다!!
감사해요
업데이트!!!
@interface MainViewController : UIViewController <FlipsideViewControllerDelegate,UITextFieldDelegate,UIPickerViewDelegate,UIPickerViewDataSource> {
IBOutlet UITextField*ageField;
NSMutableArray *agePickerArray;
IBOutlet UITextField*weightField;
NSMutableArray *weightPickerArray;
UIPickerView *weightPickerView;
UIPickerView *agePickerView;
}
- (IBAction)ageFieldDidBeginEditing;
- (IBAction)weightFieldDidBeginEditing;
- (IBAction)showInfo:(id)sender;
- (IBAction)activityButtonClicked;
@end
.m 파일
-(IBAction)weightFieldDidBeginEditing{
//UIPickerView *weightPickerView = [[UIPickerView alloc] init];
weightField.inputView = weightPickerView;
weightPickerView.showsSelectionIndicator = YES;
weightPickerView.delegate = self;
weightPickerView.dataSource = self;
[weightPickerView release];
UIToolbar *weightToolBar = [[UIToolbar alloc] initWithFrame:CGRectMake(0,0,320,44)];
UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(pickerDoneClicked:)];
[weightToolBar setItems:[NSArray arrayWithObject:doneButton] animated:NO];
weightField.inputAccessoryView = weightToolBar;
}
-(NSInteger)weightpickerView:(UIPickerView *)weightPickerView numberOfRowsInComponent:(NSInteger)component{
return [weightPickerArray count];
}
-(NSString *)weightpickerView:(UIPickerView*)weightPickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
return [weightPickerArray objectAtIndex:row];
}
// 연령 필드 코드
-(IBAction)ageFieldDidBeginEditing{
//UIPickerView *agePickerView = [[UIPickerView alloc] init];
ageField.inputView = agePickerView;
agePickerView.showsSelectionIndicator = YES;
agePickerView.delegate = self;
agePickerView.dataSource = self;
[agePickerView release];
UIToolbar *ageToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0,0,320,44)];
UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(pickerDoneClicked:)];
[ageToolbar setItems:[NSArray arrayWithObject:doneButton] animated:NO];
ageField.inputAccessoryView = ageToolbar;
}
-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)agePickerView {
return 1;
}
-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
if ([pickerView isEqual: agePickerView]) {
return [agePickerArray count];
}
if ([pickerView isEqual:weightPickerView]) {
return [weightPickerArray count];
}
}
-(NSString *)pickerView:(UIPickerView*)agePickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
return [agePickerArray objectAtIndex:row];
}
-(void)pickerView:(UIPickerView *)agePickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{
ageField.text = (NSString *) [agePickerArray objectAtIndex:row];
}
-(void)pickerDoneClicked:(id)sender{
[ageField resignFirstResponder];
[weightField resignFirstResponder];
}
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
[super viewDidLoad];
agePickerArray = [[NSMutableArray alloc] init];
for (int age=1; age<=100; age++) {
NSString *ageString = [NSString stringWithFormat:@"%d%",age];
[agePickerArray addObject:ageString];
weightPickerArray = [[NSMutableArray alloc] init];
for (int weight = 50; weight<=500; weight++) {
NSString *weightString = [NSString stringWithFormat:@"%d%",weight];
[weightPickerArray addObject:weightString];
}
}
해결책
UIPickerView *weightPickerView = [[UIPickerView alloc] init];
.h 파일(또는 인터페이스)에서 이를 선언해야 합니다.
서브클래싱을 하고 있나요? UIPickerView
?
편집* 어떤 이유로든 .h 파일에서 해당 항목을 선언하지 않으려면 tag
당신의 선택자에게.
당신의 모든 UIPickerView
s는 UIPickerViewDelegate 메소드를 호출할 것입니다. -(NSInteger)weightpickerView:(UIPickerView *)weightPickerView numberOfRowsInComponent: (NSInteger)component
당신이 서브클래싱하고 자신만의 메소드를 생성하지 않는 한 호출되지 않을 것입니다(나는 당신이 그렇지 않다고 생각합니다).
-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent: (NSInteger)component {
if([pickerView isEqual: agePickerView]){
return [agePickerArray count];
}else if([pickerView isEqual: weightPickerView]){
return [weightPickerArray count];
}else return 0;
}
태그를 사용하고 싶다면;
weightPickerView.tag = 100; //set the tag
if(pickerView.tag == 100) //check which picker it is
다른 팁
태그를 각 선택 도구에 설정하고 태그를 기준으로 다르게 처리합니다