我想创建一个投注应用程序,现在我在一个用户可以选择并输入匹配信息的页面上工作。
我的问题在于pickerView用于选择匹配类型然后选择ligue。它工作得很好但是如果我点击pickerView所在的文本区域并且我回来它,应用程序崩溃就行了:
return typeM[selectedType].ligue[row]
错误是:
线程1:致命错误:索引超出范围
如果有人可以帮我解决,那就太好了。
这是我的代码:
import UIKit
class TypeM {
var type: String
var ligue: [String]
init(type:String, ligue:[String]) {
self.ligue = ligue
self.type = type
}
}
class AskViewController: UIViewController, UITextFieldDelegate, UIPickerViewDelegate, UIPickerViewDataSource {
// MARK : variables page 1
@IBOutlet weak var eqDom: Textfield!
@IBOutlet weak var eqExt: Textfield!
@IBOutlet weak var coteDom: Textfield!
@IBOutlet weak var coteTie: Textfield!
@IBOutlet weak var coteExt: Textfield!
@IBOutlet weak var matchNulouPas: Boutons!
@IBOutlet weak var datePickerTxt: Textfield!
@IBOutlet weak var typeMatch: Textfield!
var typeM = [TypeM]()
var pickerViewTypesM = UIPickerView()
// MARK : ViewDidLoad
override func viewDidLoad() {
super.viewDidLoad()
createDatePicker()
eqDom?.delegate = self
eqExt?.delegate = self
typeMatch?.inputView = pickerViewTypesM
typeMatch?.textAlignment = .center
typeMatch?.placeholder = "select Type"
pickerViewTypesM.delegate = self
pickerViewTypesM.dataSource = self
typeM.append(TypeM(type: "Championnat", ligue: ["ENG Premier League","ENG Championship","ESP Liga 1","ESP Liga 2","FRA Ligue 1","FRA Ligue 2","GER Bundesliga","GER Bundesliga 2","ITA Serie A","ITA Serie B"]))
typeM.append(TypeM(type: "International Cup", ligue: ["UEFA Champions League","Europa League","Club World Cup","Country World Cup","Concacaf Champions League","Euro","Confederations Cup","Copa America"]))
}
// MARK : menu type match
public func numberOfComponents(in pickerView: UIPickerView) -> Int {return 2}
public func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
if component == 0 {
return typeM.count
} else {
let selectedType = pickerViewTypesM.selectedRow(inComponent: 0)
return typeM[selectedType].ligue.count
}
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
if component == 0 {
return typeM[row].type
} else {
let selectedType = pickerViewTypesM.selectedRow(inComponent: 0)
return typeM[selectedType].ligue[row]
}
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
pickerViewTypesM.reloadComponent(0)
pickerViewTypesM.reloadComponent(1)
let selectType = pickerViewTypesM.selectedRow(inComponent: 0)
let selectligue = pickerViewTypesM.selectedRow(inComponent: 1)
let type = typeM[selectType].type
let ligue = typeM[selectType].ligue[selectligue]
typeMatch.text = "--> : \( type,"" + ligue)"
}
// MARK : menu championnats
// MARK : chgmnt couleur bouton X
@IBAction func eskeNul(_ sender: Any) {
if matchNulouPas.backgroundColor == UIColor(red: 1, green: 1, blue: 1, alpha: 1) {
matchNulouPas.backgroundColor = UIColor(red: 0.74, green: 0.74, blue: 0.74, alpha: 1)
} else {
matchNulouPas.backgroundColor = UIColor(red: 1, green: 1, blue: 1, alpha: 1)
}
}
// MARK : retour clavier
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
self.view.endEditing(true)
}
// MARK : date picker
let picker = UIDatePicker()
func createDatePicker() {
let toolbar = UIToolbar()
toolbar.sizeToFit()
let done = UIBarButtonItem(barButtonSystemItem: .done, target: nil, action: #selector(donePressed))
toolbar.setItems([done], animated: false)
datePickerTxt?.inputAccessoryView = toolbar
datePickerTxt?.inputView = picker
picker.datePickerMode = .date
}
@objc func donePressed() {
let formatter = DateFormatter()
formatter.dateStyle = .medium
formatter.timeStyle = .none
let dateString = formatter.string(from: picker.date)
datePickerTxt.text = "\(dateString)"
self.view.endEditing(true)
}
}