我在斯威夫特有一个带两个组件的pickerview。除了我想用selectrow在第二个组件中设置行之外,它是有效的。当用户重新加载应用程序时,我们已经设置了一个值。第一个组件selectrow可以工作。
这是我的代码:
override func viewDidLoad() {
super.viewDidLoad()
print("In viewDidLoad")
detailArmy.loadarmy(detailArmy, armymember: detailItem)
myGeneralPicker.dataSource = self
myGeneralPicker.delegate = self
// Set General Picker View to current value
let general = generalTypeInfo()
picker1Options = general.generalType()
print("Detail Item general: \(detailArmy.general)")
if detailArmy.general == "" {
myGeneralPicker.selectRow(0, inComponent: 0, animated: false)
picker2Options = general.generalInfo("None")
} else {
myGeneralPicker.selectRow(picker1Options.indexOf(detailArmy.general)!, inComponent: 0, animated: false)
picker2Options = general.generalInfo(detailArmy.general)
}
print("Detail Item general Type: \(detailArmy.generaltype) picker2Options: \(picker2Options)")
if detailArmy.generaltype == "" {
myGeneralPicker.selectRow(0, inComponent: 1, animated: false)
} else {
//myGeneralPicker.selectRow(picker2Options.indexOf(detailArmy.generaltype)!, inComponent: 1, animated: false)
myGeneralPicker.selectRow(4, inComponent: 1, animated: false)
}
}
//MARK: Delegates and data sources
func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
//println("In numberOfComponenetsInPickerView pickerView: \(pickerView)")
return 2
}
func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
if component == 0 {
return picker1Options.count
} else {
return picker2Options.count
}
}
//Mark: Delegates
func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
//var dicerow = dice[row]
print("titleForRow row: \(row) component: \(component)")
if component == 0 {
return String(picker1Options[row])
} else {
return String(picker2Options[row])
}
}
func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
if component == 0 {
generalpickinfo = picker1Options[row]
print("pickerView general selected: \(generalpickinfo)")
let general = generalTypeInfo()
picker2Options = general.generalInfo(picker1Options[row])
pickerView.reloadAllComponents()
myGeneralPicker.selectRow(0, inComponent: 1, animated: false)
} else {
generalpicktype = picker2Options[row]
print("pickerView general type selected: \(generalpicktype)")
}
}
func pickerView(pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusingView view: UIView?) -> UIView {
print("viewForRow row: \(row) component: \(component)")
let pickGeneralLabel = UILabel()
pickGeneralLabel.textAlignment = .Center
if component == 0 {
pickGeneralLabel.text = String(picker1Options[row])
} else {
pickGeneralLabel.text = String(picker2Options[row])
}
return pickGeneralLabel
}
class generalTypeInfo {
func generalType() -> [String] {
return ["None","C-in-C","Subordinate","Ally"]
}
func generalInfo(type: String) -> [String] {
if type == "None" {
return ["None"]
} else {
return ["None","Brilliant","Inert"]
}
}
func generalTypeIndex(type: String) -> Int {
let generalTypeDict = ["None": 0, "C-in-C": 1, "Subordinate": 2, "Ally": 3]
return generalTypeDict[type]!
}
func generalInfoIndex(type: String) -> Int {
let generalInfoDict = ["None": 0, "Brilliant": 1, "Inert": 2]
return generalInfoDict[type]!
}
}
在我目前的代码中,我特意在这行中输入了一个值4:
myGeneralPicker.selectRow(4, inComponent: 1, animated: false)
上面这一行有我想运行的正确代码,但是我把它放进去是因为它应该会使应用程序崩溃,因为没有第四个值。它完全忽略了这一点。
有人告诉我这是怎么回事吗?谢谢。
最佳答案
所以,问个问题,然后找出答案。。
答案是将selectrow移到ViewDidAppear中。
我在这里找到了解决办法:
UIPickerView selectRow doesn't works
谢谢