كيف يمكنني برمجة أكثر من UIPickerView في نفس العرض؟
-
13-12-2019 - |
سؤال
أنا أستخدم خاصية textFields inputView لعرض UIPickerViews بدلاً من لوحة المفاتيح.بالطريقة التي برمجتها بها، لا أقوم بإعلان PickerViews في ملف .H، ولا أقوم بتوصيلها في العرض في أداة إنشاء الواجهة.عندما أقوم بتنفيذ خصائص Pickerviews، لا أستطيع أن أجعل كل منها بخصائص مختلفة.لقد حاولت استخدام عبارات "if" لإخبارها أن لها خصائص مختلفة اعتمادًا على المنتقي الذي تم استخدامه كما يلي....
-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)agePickerView {
if ([pickerView isEqual: agePickerView]){
return 1;
}
if ([pickerView isEqual: weightPickerView]){
return 1;
}
}
عندما أفعل ذلك، سيظهر لي أن WeightPickerView غير معلن.إذن هذا هو الكود الخاص بي لتنفيذ PickerViews.
@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"" أو أي خاصية أخرى أقوم بها.الرجاء المساعدة، حتى لو اضطررت إلى تغييره وإعلان PickerViews في ملف .H بطريقة أو بأخرى، لا يهمني ما يجب أن أفعله طالما أستطيع تشغيل هذا !!
شكرًا
تحديث!!!
@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
سيتم استدعاء أساليب 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
نصائح أخرى
تعيين علامة لكل عرض منتقي والتعامل معها بشكل مختلف بناء على علامة