如何更改 UIpickerView 上的元素按下按钮或按下另一个按钮

Posted

技术标签:

【中文标题】如何更改 UIpickerView 上的元素按下按钮或按下另一个按钮【英文标题】:how to change elements on UIpickerView pushing a button or pushing another button 【发布时间】:2013-05-02 17:44:04 【问题描述】:

我有一个应用程序,在主视图中有 3 个按钮,并且 2 个第一按钮必须显示 UIPickerView 用于选择事件(其中一个)和选择时间(第二个)。

UIPickerViewDelegate只让我实现一次方法,所以,我该如何更改UIPickerView的内容。

这是 mi .m 代码:​​

    #import "Home_ViewController.h"

    @interface Home_ViewController ()

@end

@implementation Home_ViewController

@synthesize index,arrayHoras,arrayRutas,pickerView, rutaId, horas, botonHoras, botonRuta, hora;

- (IBAction)selectRuta:(id)sender 
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:0.3];
    [self.view addSubview:pickerView];
    [UIView commitAnimations];
    [pickerView setHidden:NO];



- (IBAction)horasBoton:(id)sender 
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:0.3];
    [self.view addSubview:pickerView];
    [UIView commitAnimations];
    [pickerView setHidden:NO];


- (void)viewDidLoad

    [super viewDidLoad];
    hora = 1;
    arrayRutas = [[NSMutableArray alloc] init];
    arrayHoras = [[NSMutableArray alloc] initWithObjects: @"1", @"2", @"3", @"4", @"5", @"6", @"7", @"8", @"9", @"10", @"11", @"12", nil];

    sqlite3 *turutaDB;
    NSArray *dirPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *databasePath = [[dirPath objectAtIndex:0] stringByAppendingPathComponent:@"turuta.db"];

    NSLog(@"path de la bbdd: %@",  databasePath);
    if(sqlite3_open([databasePath UTF8String], &turutaDB)==SQLITE_OK) 
        NSLog(@"2 Base de datos creada y abierta con exito");
     else 
        NSLog(@"Ha fallado la apertura de la bbdd");
    

    sqlite3_stmt *sentenciaRutas;
    NSString *querySQLrutas = @"SELECT id,nombre FROM rutas";

    if(sqlite3_prepare_v2(turutaDB, [querySQLrutas UTF8String], -1, &sentenciaRutas, NULL)==SQLITE_OK)
        NSLog(@"Consulta preparada ok");
     else 
        NSLog(@"Consulta ha fallado al preparar: %s", sqlite3_errmsg(turutaDB));
    


    while (sqlite3_step(sentenciaRutas) == SQLITE_ROW) 
        NSString *selectRutas = [[NSString alloc] initWithUTF8String:
                                 (const char *) sqlite3_column_text(sentenciaRutas, 1)];

        [arrayRutas addObject:selectRutas];


    



    sqlite3_finalize(sentenciaRutas);

  //  [self.tabBarController.tabBar setHidden:YES];
    // Do any additional setup after loading the view, typically from a nib.


- (void)didReceiveMemoryWarning

    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.


- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView 

    return 1;

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

    if(!botonHoras.isTouchInside) 
        return [arrayHoras count];
     else  
        return [arrayRutas count];
    


- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component 
    if(!botonHoras.isTouchInside) 
        return [arrayHoras objectAtIndex:row];
     else  
        return [arrayRutas objectAtIndex:row];
    


- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component 

    if (!botonHoras.isTouchInside) 
        horas= [[arrayHoras objectAtIndex:row] intValue];
        botonHoras.titleLabel.text = [NSString stringWithFormat:@"%d Horas", horas];
        [self.pickerView removeFromSuperview];

     else 


        //GMSPolylineOptions *optionsLine = [GMSPolylineOptions options];
        GMSMutablePath *ruta = [GMSMutablePath path];


        sqlite3 *turutaDB;
        NSArray *dirPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *databasePath = [[dirPath objectAtIndex:0] stringByAppendingPathComponent:@"turuta.db"];

        NSLog(@"path de la bbdd: %@",  databasePath);
        if(sqlite3_open([databasePath UTF8String], &turutaDB)==SQLITE_OK) 
            NSLog(@"2 Base de datos creada y abierta con exito");
         else 
            NSLog(@"Ha fallado la apertura de la bbdd");
        

        sqlite3_stmt *sentenciaId;
        NSString *querySQLid = [NSString stringWithFormat: @"SELECT id FROM rutas WHERE nombre = '%@'", [arrayRutas objectAtIndex:row]];
        if(sqlite3_prepare_v2(turutaDB, [querySQLid UTF8String], -1, &sentenciaId, NULL)==SQLITE_OK)
            NSLog(@"Consulta preparada ok");
         else 
            NSLog(@"Consulta ha fallado al preparar: %s", sqlite3_errmsg(turutaDB));
        


        while (sqlite3_step(sentenciaId) == SQLITE_ROW) 
            NSString *id = [[NSString alloc] initWithUTF8String:
                        (const char *) sqlite3_column_text(sentenciaId, 0)];

            rutaId = [id intValue];
            NSLog(@"%d",rutaId);


        
        sqlite3_finalize(sentenciaId);

        sqlite3_stmt *sentenciaPolyLine;
        NSString *querySQLpoliline =[NSString stringWithFormat: @"SELECT coordx,coordy FROM config_ruta WHERE id_ruta = %d", rutaId];
        if(sqlite3_prepare_v2(turutaDB, [querySQLpoliline UTF8String], -1, &sentenciaPolyLine, NULL)==SQLITE_OK)
            NSLog(@"Consulta preparada ok");
         else 
            NSLog(@"Consulta ha fallado al preparar: %s", sqlite3_errmsg(turutaDB));
        


        while (sqlite3_step(sentenciaPolyLine) == SQLITE_ROW) 
            NSString *x = [[NSString alloc] initWithUTF8String:
                           (const char *) sqlite3_column_text(sentenciaPolyLine, 1)];

            NSString *y = [[NSString alloc] initWithUTF8String:
                           (const char *) sqlite3_column_text(sentenciaPolyLine, 0)];

            double coordx = [x doubleValue];
            double coordy = [y doubleValue];
            NSLog(@"%f | %f",coordy,coordx);


            [ruta addCoordinate:CLLocationCoordinate2DMake(coordy, coordx)];

        



    sqlite3_finalize(sentenciaPolyLine);


        botonRuta.titleLabel.text = [arrayRutas objectAtIndex:row];

        [self.pickerView removeFromSuperview];
        [pickerView selectRow:0 inComponent:0 animated:YES];
    






- (IBAction)rutaboton:(id)sender 


请帮忙...

【问题讨论】:

【参考方案1】:

您需要设置一个标志来指示按下了哪个按钮。然后在每个选择器视图数据源和委托方法中检查该标志。

int 属性添加到您的类。在selectRuta: 方法中,将属性设置为1。在horasBoton:方法中,设置属性为2

然后你的选择器视图方法看起来像这样(假设你的属性被命名为buttonType):

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component 
    if(self.buttonType == 1) 
        return [arrayRutas count];
     else  
        return [arrayHoras count];
    

【讨论】:

谢谢,这行得通,但现在我有另一个问题,如果我按下第一个按钮,当我选择一行并按下另一个按钮时,pickerView 会显示来自第一个按钮的数据。如果我先按第二个按钮,向我显示第二个按钮的数据,选择一行,然后按另一个按钮,pickerView 会显示我第一次按的按钮的数据。当我选择一行并隐藏pickerView时如何删除所有数据? 你应该在你的两个按钮方法中重新加载选择器视图(在设置buttonType属性之后)。 设置buttonType属性后只需添加[self.pickerView reloadAllComponents];

以上是关于如何更改 UIpickerView 上的元素按下按钮或按下另一个按钮的主要内容,如果未能解决你的问题,请参考以下文章

按下按钮后如何动画显示 UIPickerView?

UIPickerView,无法从数组中获取数据

如何根据按钮按下重新加载/刷新 UIPickerView(带有新数据数组)?

如何遍历一组颜色以更改键上的背景(按下/按下)

如何从另一个 UIPickerview 更改 UIPickerView 的字符串?

UIPickerView 重新加载组件不起作用