【问题标题】:How to get selected row's title and value in uipickerview?如何在uipickerview中获取选定行的标题和值?
【发布时间】:2014-06-11 06:17:15
【问题描述】:

在我的 iphone 项目中,我需要从 sqlite 获取数据并将其显示在 uipickerview 上,然后使用所选行的值填充另一个 uipickerview

在我的表 T_REGION 中有两列 ID 和 NAME

这就是我获取 REGION 列表的方式

- (NSArray*) getRegions
{

const char *dbpath = [databasePath UTF8String];
if (sqlite3_open(dbpath, &database) == SQLITE_OK)
{

    NSString *querySQL = [NSString stringWithFormat:@"select ID,NAME from T_REGION"];
    const char *query_stmt = [querySQL UTF8String];
    NSMutableArray *resultArray = [[NSMutableArray alloc]init];
    if (sqlite3_prepare_v2(database,
                           query_stmt, -1, &statement, NULL) == SQLITE_OK)
    {
        while (sqlite3_step(statement) == SQLITE_ROW)
        {



            NSString *name = [[NSString alloc] initWithUTF8String:
                              (const char *) sqlite3_column_text(statement, 1)];
            [resultArray addObject:name];


        }
        sqlite3_reset(statement);

        return resultArray;
    }
    else
    {
        NSLog(@"problem");
    }
}
return nil;
}

如您所见,我无法将 ID 列填充到仅数组名称列返回,我需要 ID 列来填充另一个 uipickerview(您可能认为是国家 - 城市关系) 这是我的第一个问题

现在这就是我填充我的pickerview的方式

首先在 viewDidLoad 方法中我得到数组:

- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
[self getdata];
}

- (void)getdata {
 dataRegion = [[NSArray alloc] initWithArray: [[DBHelper getSharedInstance:@"2_program.db"]getRegions]];


}

和我的 uipickerview 委托方法

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
return 1;
}

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
if (pickerView.tag == 1)
    return [dataRegion count];
else
    return 0; //[countryTypes count];

}


- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
if (pickerView.tag == 1)
    return [dataRegion objectAtIndex:row];
else
    return @"";


}


 - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:  (NSInteger)component
 {
if (pickerView.tag == 1) {
    NSString *categoryType  = [dataRegion objectAtIndex:[pickerView selectedRowInComponent:0]];
    [btnBolge setTitle:categoryType forState:UIControlStateNormal];

}else {



}

  }

我想要的是选择选项标签在 html 中的作用。我需要 2 列,但只显示 1 列并获取所选行的值而不是文本

1- 如何在 getRegions 函数中返回 2 列? 2- 如何在 uipickerview 中仅显示名称列并获取其选定行的 id 列?

【问题讨论】:

    标签: ios objective-c sqlite uipickerview


    【解决方案1】:

    试试这个..可能会有帮助..

    像这样你可以将两个数组都添加为字典

     NSMutableArray *nameArray = [[NSMutableArray alloc]initWithObjects:@"Come",@"Say",@"Go", nil];
        NSMutableArray *regionArray = [[NSMutableArray alloc]initWithObjects:@"Hi",@"Hello",@"Bye", nil];
    
    
        NSMutableArray *mainArray = [[NSMutableArray alloc]init];
    
        for (int index = 0; index<regionArray.count; index++) {
            NSMutableDictionary *dataAddDic = [[NSMutableDictionary alloc]init];
            [dataAddDic setValue:[nameArray objectAtIndex:index] forKeyPath:@"name"];
            [dataAddDic setValue:[regionArray objectAtIndex:index] forKeyPath:@"region"];
            [mainArray addObject:dataAddDic];
        }
        NSLog(@"Data Print %@",mainArray);
    

    在你需要改变你的委托功能之后

    -(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
    {
    if (pickerView.tag == 1)
        return [mainArray count];
    else
        return 0; //[countryTypes count];
    
    }
    
    
    - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
    {
    if (pickerView.tag == 1)
        return  [[mainArray objectAtIndex:row] valueForKey:@"region"];
    else
        return @"";
    
    
    }
    
     - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:  (NSInteger)component
     {
    if (pickerView.tag == 1) {
        NSString *categoryType  = [[mainArray objectAtIndex:row] valueForKey:@"name"];
        [btnBolge setTitle:categoryType forState:UIControlStateNormal];
    
    }else {
    
     }
    
     }
    

    【讨论】:

    • 但如您所见,id 列没有数组。我需要一个数组或其他东西来填充 id 列我只有区域的名称首先我需要获取 id 然后我需要获取选定的 uipickerview 行的索引
    • 我认为您正在尝试从两个数组中获取数据。对或错。
    • 是的,没错。但是如果我创建另一个数组,我不能返回它,因为我的方法只返回一个数组,我不想连接到 sqlite 2 次,所以也许字典可以解决我的问题,但我不知道如何用 2 个数组填充字典
    • 我已经像示例一样更新了我的答案,但是您需要替换两个数组 1.“nameArray”、2.“regionArray”上的数据。试试这个..可能会帮到你..谢谢..
    • 检查与否...如果对您有帮助,请接受我的回答...谢谢
    【解决方案2】:
    const char *dbpath = [databasePath UTF8String];  
    if (sqlite3_open(dbpath, &database) == SQLITE_OK)  
    {  
        NSString *querySQL = [NSString stringWithFormat:@"select ID,NAME from T_REGION"];  
        const char *query_stmt = [querySQL UTF8String];  
        NSMutableArray *resultArray = [[NSMutableArray alloc]init];  
        if (sqlite3_prepare_v2(database,query_stmt, -1, &statement, NULL) == SQLITE_OK)  
        {  
            while (sqlite3_step(statement) == SQLITE_ROW)  
            {  
                NSString *id = [[NSString alloc] initWithUTF8Strin  
                    (const char *) sqlite3_column_text(statement, 0)];  
    
                NSString *name = [[NSString alloc] initWithUTF8String:  
                    (const char *) sqlite3_column_text(statement, 1)];  
    
                NSDictionary *dict = @{id:name};  
                [resultArray addObject:dict];  
    
            }  
            sqlite3_reset(statement);  
    
            return resultArray;  
            }  
            else  
            {  
                NSLog(@"problem");  
            }  
        }  
        return nil;  
    
    }  
    - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row  forComponent:(NSInteger)component  
    {  
    
        if (pickerView.tag == 1){  
            NSDictionary *region = [dataRegion objectAtIndex:row];  
            NSArray *keys = [region allKeys];  
            return region[[keys[0]];  
        }  
        else{  
            return @"";  
        }  
    
    }  
    
    - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:   (NSInteger)component  
    {  
        if (pickerView.tag == 1) {  
            NSDictionary *region  = [dataRegion objectAtIndex:row];  
            NSArray *keys = [region allKeys];  
            [btnBolge setTitle:region[keys[0]] forState:UIControlStateNormal];  
        }else {  
    
        }  
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多