在操作表中显示多个 UIPicker

发布于 2024-12-26 11:08:18 字数 4303 浏览 1 评论 0原文

在我的视图控制器之一中,我想使用多个选择器。

头文件:

@interface MyTableController : TTTableViewController <UIActionSheetDelegate, UIPickerViewDataSource, UIPickerViewDelegate>{

    IBOutlet UIPickerView *picker1;
    IBOutlet UIPickerView *picker2;

    NSMutableArray *list1;
    NSMutableArray *list2;
}

@property(nonatomic,retain) UIPickerView *picker1, *picker2;

-(IBAction)togglePickerView1;
-(IBAction)togglePickerView2;

@end

实现文件:

@implementation MyTableController

@synthesize picker1, picker2;

int row_index1 = 0;
int row_index2 = 0;

- (void)locationPicker:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent: (NSInteger)component
{
    if([pickerView isEqual: picker1]){
        row_index1 = row;
    }

    if([pickerView isEqual: picker2]){
        row_index2 = row;
    }
}

-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{

    if([pickerView isEqual: picker1]){
        return 1;
    }

    if([pickerView isEqual: picker2]){
        return 1;
    }         
    return 0;
}

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{
    if([pickerView isEqual: picker1]){
        return [list1 count];
    }

    if([pickerView isEqual: picker2]){
        return [list2 count];
    }  
    return 0;
}

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent: (NSInteger)component{
    return [list objectAtIndex:row];
    if([pickerView isEqual: picker1]){
        return [list1 objectAtIndex:row];
    }

    if([pickerView isEqual: picker2]){
        return [list2 objectAtIndex:row];
    }

    return nil;
}

-(void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex {  

}

- (void)willPresentActionSheet:(UIActionSheet *)actionSheet {

    if (actionSheet.tag == 111) {
        picker1 = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 40, 320, 216)];
        picker1.showsSelectionIndicator = YES;
        picker1.dataSource = self;
        picker1.delegate = self;  

        //Add picker to action sheet
        [actionSheet addSubview:picker1];
        [picker1 release];
    }else if(actionSheet.tag == 222){
        picker2 = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 40, 320, 216)];
        picker2.showsSelectionIndicator = YES;
        picker2.dataSource = self;
        picker2.delegate = self;

        //Add picker to action sheet
        [actionSheet addSubview:picker2];
        [picker2 release];
    }

    //Gets an array af all of the subviews of our actionSheet
    NSArray *subviews = [actionSheet subviews];

    [[subviews objectAtIndex:1] setFrame:CGRectMake(20, 266, 280, 46)]; 
    [[subviews objectAtIndex:2] setFrame:CGRectMake(20, 317, 280, 46)];
}

-(IBAction)togglePickerView1{
    UIActionSheet *asheet = [[UIActionSheet alloc] initWithTitle:NSLocalizedString(@"FLT", nil) delegate:self cancelButtonTitle:NSLocalizedString(@"CANCEL", nil) destructiveButtonTitle:nil otherButtonTitles:NSLocalizedString(@"PICK", nil), nil];
    [asheet setTag:111];
    [asheet showInView:[self.view superview]]; //note: in most cases this would be just self.view, but because I was doing this in a tabBar Application, I use the superview.
    [asheet setFrame:CGRectMake(0, 117, 320, 383)];
    [asheet release];   
}

-(IBAction)togglePickerView2{
    //...  
    [asheet setTag:222];
    //...
}

- (void)loadView {
    [super loadView];
}

-(void)viewDidLoad{

    UIBarButtonItem *item1 = [[UIBarButtonItem alloc] initWithTitle:@"Button1" style:UIBarButtonItemStyleBordered target:self action:@selector(togglePickerView1)];

    UIBarButtonItem *item2 = [[UIBarButtonItem alloc] initWithTitle:@"Button2" style:UIBarButtonItemStyleBordered target:self action:@selector(togglePickerView2)];


    NSArray *myToolbarItems = [[NSArray alloc] initWithObjects: item1, item2, nil];                 

    [self setToolbarItems: myToolbarItems];
    [myToolbarItems release];

    list1 = [[NSMutableArray alloc] init];

    [list1 addObject:@"--"];
    [list1 addObject:@"Test1"];

    list2 = [[NSMutableArray alloc] init];

    [list2 addObject:@"--"];
    [list2 addObject:@"Test2"];
}


@end

我的问题是,无论我点击哪个按钮,总是触发 picker1 。有什么想法问题出在哪里吗?

in one of my view controllers I want to use multiple pickers.

Header file:

@interface MyTableController : TTTableViewController <UIActionSheetDelegate, UIPickerViewDataSource, UIPickerViewDelegate>{

    IBOutlet UIPickerView *picker1;
    IBOutlet UIPickerView *picker2;

    NSMutableArray *list1;
    NSMutableArray *list2;
}

@property(nonatomic,retain) UIPickerView *picker1, *picker2;

-(IBAction)togglePickerView1;
-(IBAction)togglePickerView2;

@end

Implementation file:

@implementation MyTableController

@synthesize picker1, picker2;

int row_index1 = 0;
int row_index2 = 0;

- (void)locationPicker:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent: (NSInteger)component
{
    if([pickerView isEqual: picker1]){
        row_index1 = row;
    }

    if([pickerView isEqual: picker2]){
        row_index2 = row;
    }
}

-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{

    if([pickerView isEqual: picker1]){
        return 1;
    }

    if([pickerView isEqual: picker2]){
        return 1;
    }         
    return 0;
}

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{
    if([pickerView isEqual: picker1]){
        return [list1 count];
    }

    if([pickerView isEqual: picker2]){
        return [list2 count];
    }  
    return 0;
}

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent: (NSInteger)component{
    return [list objectAtIndex:row];
    if([pickerView isEqual: picker1]){
        return [list1 objectAtIndex:row];
    }

    if([pickerView isEqual: picker2]){
        return [list2 objectAtIndex:row];
    }

    return nil;
}

-(void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex {  

}

- (void)willPresentActionSheet:(UIActionSheet *)actionSheet {

    if (actionSheet.tag == 111) {
        picker1 = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 40, 320, 216)];
        picker1.showsSelectionIndicator = YES;
        picker1.dataSource = self;
        picker1.delegate = self;  

        //Add picker to action sheet
        [actionSheet addSubview:picker1];
        [picker1 release];
    }else if(actionSheet.tag == 222){
        picker2 = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 40, 320, 216)];
        picker2.showsSelectionIndicator = YES;
        picker2.dataSource = self;
        picker2.delegate = self;

        //Add picker to action sheet
        [actionSheet addSubview:picker2];
        [picker2 release];
    }

    //Gets an array af all of the subviews of our actionSheet
    NSArray *subviews = [actionSheet subviews];

    [[subviews objectAtIndex:1] setFrame:CGRectMake(20, 266, 280, 46)]; 
    [[subviews objectAtIndex:2] setFrame:CGRectMake(20, 317, 280, 46)];
}

-(IBAction)togglePickerView1{
    UIActionSheet *asheet = [[UIActionSheet alloc] initWithTitle:NSLocalizedString(@"FLT", nil) delegate:self cancelButtonTitle:NSLocalizedString(@"CANCEL", nil) destructiveButtonTitle:nil otherButtonTitles:NSLocalizedString(@"PICK", nil), nil];
    [asheet setTag:111];
    [asheet showInView:[self.view superview]]; //note: in most cases this would be just self.view, but because I was doing this in a tabBar Application, I use the superview.
    [asheet setFrame:CGRectMake(0, 117, 320, 383)];
    [asheet release];   
}

-(IBAction)togglePickerView2{
    //...  
    [asheet setTag:222];
    //...
}

- (void)loadView {
    [super loadView];
}

-(void)viewDidLoad{

    UIBarButtonItem *item1 = [[UIBarButtonItem alloc] initWithTitle:@"Button1" style:UIBarButtonItemStyleBordered target:self action:@selector(togglePickerView1)];

    UIBarButtonItem *item2 = [[UIBarButtonItem alloc] initWithTitle:@"Button2" style:UIBarButtonItemStyleBordered target:self action:@selector(togglePickerView2)];


    NSArray *myToolbarItems = [[NSArray alloc] initWithObjects: item1, item2, nil];                 

    [self setToolbarItems: myToolbarItems];
    [myToolbarItems release];

    list1 = [[NSMutableArray alloc] init];

    [list1 addObject:@"--"];
    [list1 addObject:@"Test1"];

    list2 = [[NSMutableArray alloc] init];

    [list2 addObject:@"--"];
    [list2 addObject:@"Test2"];
}


@end

My problem is that no matter which button I hit, it is always the picker1 that is triggered. Any ideas where the problem is?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

梦途 2025-01-02 11:08:18

您已成功创建两个不同的选择器,并且每次都显示正确的选择器。

问题是,每个选择器都有相同的数据。

数据源 titleForRow... 方法中的第一行是这样的:

return [list objectAtIndex:row];

这通过返回一个值来结束数据源方法的执行,因此两个选择器将始终显示相同的数据,无论其余的如何你的代码。 list 在上面的代码中没有声明,所以我不确定你在屏幕上实际看到的是什么。

我使用上面的代码构建了一个示例项目,并确认这就是问题所在。删除该行将为您提供两个不同的选择器,每个选择器中都有不同的内容。

You are successfully creating two different pickers, and showing the correct one each time.

The problem is, each picker has the same data in it.

The first line in your data source titleForRow... method is this:

return [list objectAtIndex:row];

This ends execution of your data source method by returning a value, so both pickers will always show the same data, regardless of the rest of your code. list isn't declared anywhere in your code above so I'm not sure what you are actually seeing on the screen.

I have built a sample project using your code above and confirmed that this is the issue. Removing that line gives you two different pickers, with the different content in each one.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文