Я знаю, что вы попросили код 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])")
}
Показать код, если что-нибудь попробовал? – iphonic
- (void) pickerView: (UIPickerView *) pickerView didSelectRow: (NSInteger) row inComponent: (NSInteger) компонент { self.txtOfficeLocation.text = self.provinceArray [row]; для (INT I = 0; я