Несколько UIPickers для отображения в листе действий - PullRequest
2 голосов
/ 11 января 2012

в одном из моих контроллеров представления я хочу использовать несколько сборщиков.

Заголовочный файл:

@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. Есть идеи, где проблема?

1 Ответ

2 голосов
/ 13 января 2012

Вы успешно создаете два разных сборщика и каждый раз показывает правильный.

Проблема в том, что каждый сборщик имеет одинаковые данные.

Первая строка в вашем источнике данных titleForRow... метод выглядит следующим образом:

return [list objectAtIndex:row];

Это завершает выполнение метода источника данных, возвращая значение, поэтому оба средства выбора всегда будут отображать одно и то жеданные, независимо от остальной части вашего кода.list не указано нигде в вашем коде выше, поэтому я не уверен, что вы на самом деле видите на экране.

Я создал пример проекта, используя ваш код выше, и подтвердил, что это проблема.Удаление этой строки дает вам два разных выбора, с различным содержанием в каждом.

...