线程1:致命错误:索引超出范围

时间:2018-03-07 20:52:19

标签: ios swift uipickerview

我想创建一个投注应用程序,现在我在一个用户可以选择并输入匹配信息的页面上工作。

我的问题在于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)
    }
}

0 个答案:

没有答案