如何更改 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(带有新数据数组)?