【问题标题】:How to manage country/state/city in single picker?如何在单个选择器中管理国家/州/城市?
【发布时间】:2017-01-18 08:05:15
【问题描述】:

如何使用单一选择器 Objective-C 管理国家/州/城市值?

当我尝试它时,它会在索引更改时崩溃。它适用于城市和州,但与城市有关。哪个库会更好?

在下面查看我的代码

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{
     self.txtOfficeLocation.text = self.provinceArray[row]; 
     for (int i = 0; i < self.provinceKeyValueDic.count; i++) {
        if ([self.provinceKeyValueDic.allKeys[i] isEqualToString:self.provinceArray[row]]){
                 provinceID = [[self.provinceKeyValueDic.allValues[i]valueForKey:@"id"]in‌​tegerValue]; NSLog(@"province key :%d", provinceID); 
        }
     }
 }

【问题讨论】:

  • 显示您的代码,如果您尝试过?
  • - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{ self.txtOfficeLocation.text = self.provinceArray[row]; for (int i = 0; i

标签: ios objective-c datepicker uipickerview picker


【解决方案1】:

我知道您要求提供 Objective-C 代码,但这里有一个简单的示例 - 关键元素很容易翻译。

我不知道你是如何设置数据的,但我创建了一些这样的

    struct StateData
{
    var state : String
    var city : [String] = []
}

struct CountryData
{
    var country : String
    var state : [StateData] = []
}

var pickerData : [CountryData] = []

你可以用任何你喜欢的方式填充它

    var stateData = CountryData(country: "UK", state: [StateData(state: "Midlothian", city: ["Edinburgh", "Bathgate", "Livingston"])])
    stateData.state.append(StateData(state: "Strathclyde", city: ["Glasgow", "Prestwick", "Lanark"]))
    pickerData.append(stateData)

    stateData = CountryData(country: "USA", state: [StateData(state: "Alabama", city: ["Montgomery", "Birmingham"])])
    stateData.state.append(StateData(state: "Alaska", city: ["Juneau", "Anchorage"]))
    stateData.state.append(StateData(state: "Arizona", city: ["Phoenix", "Another city", "City 3"]))
    pickerData.append(stateData)

我认为关键是跟踪您选择的内容

var countrySelected : Int   = 0
var stateSelected : Int     = 0
var citySelected : Int      = 0

pickerView 方法需要看起来像这样

func numberOfComponents(in pickerView: UIPickerView) -> Int
{
    return 3 // country, state, city
}

func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int
{
    switch component
    {
    case 0: // country
        return pickerData.count

    case 1: // state
        return pickerData[countrySelected].state.count

    case 2: // city
        return pickerData[countrySelected].state[stateSelected].city.count

    default:
        return 0
    }
}

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String?
{
    switch component
    {
    case 0: // country
        return pickerData[row].country

    case 1: // state
        return pickerData[countrySelected].state[row].state

    case 2: // city
        return pickerData[countrySelected].state[stateSelected].city[row]

    default:
        return ""
    }
}

有趣的是要确保当您更改国家/地区或州时,您最终不会得到指向新显示中不存在的值的州或城市索引 - 就像当你从一个州的第三个城市选择了一个州,然后搬到了一个只有两个城市的州。这将产生您所看到的越界错误。你可以这样修复它

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int)
{

    switch component {
    case 0: // country
        countrySelected = pickerView.selectedRow(inComponent: 0)
        stateSelected = 0
        citySelected = 0

        pickerView.reloadComponent(1)
        pickerView.selectRow(0, inComponent: 1, animated: true)
        pickerView.reloadComponent(2)
        pickerView.selectRow(0, inComponent: 2, animated: true)

    case 1: // country
        stateSelected = pickerView.selectedRow(inComponent: 1)
        citySelected = 0

        pickerView.reloadComponent(2)
        pickerView.selectRow(0, inComponent: 2, animated: true)

    case 2: // country
        citySelected = pickerView.selectedRow(inComponent: 2)

    default:
        break
    }

    print("\(pickerData[countrySelected].country), \(pickerData[countrySelected].state[stateSelected].state), \(pickerData[countrySelected].state[stateSelected].city[citySelected])")
}

【讨论】:

    猜你喜欢
    • 2019-02-15
    • 2017-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-20
    • 2011-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多