为了更好地学习Swift 3/ iOS,我做了一个小小的测试应用程序。我刚开始使用Swift 2,但是停止了,所以回到它,但是有这么多的iOS需要学习!
它似乎工作得很好,所以当用户按下“完成”按钮时,我将选择视图值插入到textfield中。我发现如果没有这样做,如果用户想要选择视图的第一个值,就不会像滚动到另一个值时那样插入。我留下了控制器的相关代码。
class ViewController: UITableViewController, UIPickerViewDataSource, UIPickerViewDelegate {
let pickerData: [String] = ["1", "2", "3", "4"]
var picker = UIPickerView()
@IBOutlet weak var textField: UITextField!
// set the pickerview for number of periods
func setPickerView(){
picker.dataSource = self
picker.delegate = self
textField.inputView = picker
textField.inputAccessoryView = initToolBar()
}
// build the toolbar for uipicker, so a user can select a value
func initToolBar() -> UIToolbar {
let toolBar = UIToolbar()
toolBar.barStyle = UIBarStyle.default
toolBar.isTranslucent = true
toolBar.tintColor = UIColor(red:14.0/255, green:122.0/255, blue:254.0/255, alpha: 1)
toolBar.sizeToFit()
// TODO need to update actions for all buttons
let cancelButton = UIBarButtonItem(title: "Cancel", style: UIBarButtonItemStyle.plain, target: self, action: nil)
let doneButton = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.plain, target: self, action: #selector(pickerDoneAction))
let spaceButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.flexibleSpace, target: nil, action: nil)
toolBar.setItems([cancelButton, spaceButton, doneButton], animated: false)
toolBar.isUserInteractionEnabled = true
return toolBar
}
// Take pickerview value and insert into textfield, this stops the first row on load not being loaded into textfield
func pickerDoneAction(sender: UITextField){
let indexPath = picker.selectedRow(inComponent: 0)
textField.text = pickerData[indexPath]
// resign first responder dropping the uipicker
UIApplication.shared.sendAction(#selector(resignFirstResponder), to:nil, from:nil, for:nil)
}
// Pickerview delegates
func numberOfComponents(in pickerView: UIPickerView) -> Int { return 1 }
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {return pickerData.count}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {return pickerData[row]}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
textField.text = pickerData[row]
}
}如果代码非常合适,并让它在同一个屏幕上具有不同数据源的多个uipickers上工作,我想使用这个方法。虽然我还不太确定
发布于 2017-03-10 10:08:45
一个简单的修复方法是在数据源的开头添加一个空的额外值。
设pickerData:字符串 = “、”1“、”2“、”3“、”4“
或者,只要他们开始编辑let textField.text = pickerData[0],您就可以立即使用textField。
https://codereview.stackexchange.com/questions/157391
复制相似问题