Ошибка индексации вне диапазона при попытке перейти непосредственно к концу массива

Это мой массив в проекте в Xcode.

Var questions = ["q.1", "q.2", "q.3"]

Я добавил две кнопки, то есть кнопку "вперед" и кнопку "назад", для прокрутки вопросов. Теперь, когда я впервые нажимаю кнопку "назад", как только запускаю свой проект на симуляторе, чтобы он сразу перешел к "q.3", он выдает ошибку, говорящую:

"Index out of range." 

Имейте в виду, что когда я сначала нажимаю на кнопку "Вперед", она работает нормально и получает "q.2", но при первоначальном нажатии на кнопку "Назад" выдает ошибку. Ниже мой код.

@IBOutlet weak var question: UILabel! //this is my question label 
questions = ["q.1", "q.2", "q.3"] //this is my array of questions

currentQuestionIndex = 0

@IBAction func backwardBtnTapped(_ sender: Any) {

currentQuestionIndex -= 1
let noOfQuestions = questions.count
let previousQuestionIndex = currentQuestionIndex % noOfQuestions
question.text = questions[previousQuestionIndex]

@IBAction func forwardBtnTapped(_ sender: Any) {

currentQuestionIndex += 1
let noOfQuestions =  questions.count
let nextQuestionIndex =  currentQuestionIndex % noOfQuestions
question.text =  questions[nextQuestionIndex] 

3 ответа

Решение

Если вы хотите, чтобы кнопки "вперед" и "назад" были отключены, когда вы отвечаете на последний и первый вопрос соответственно. Вы можете сделать следующее:

Предполагая, что выход вашей кнопки с именем forwardButton и backwardButton инициализирует его как:

backwardButton.userInteractionEnabled = NO

И сделайте свой IBAction для кнопок вперед и назад как:

@IBAction func backwardBtnTapped(_ sender: Any) {

    currentQuestionIndex -= 1
    if currentQuestionIndex == 0 {
        backwardButton.userInteractionEnabled = NO
    }
    forwardButton.userInteractionEnabled = YES
    let noOfQuestions = questions.count
    let previousQuestionIndex = currentQuestionIndex % noOfQuestions
    question.text = questions[previousQuestionIndex]
}

@IBAction func forwardBtnTapped(_ sender: Any) {

    currentQuestionIndex += 1
    if currentQuestionIndex >= questions.count - 1 {
        forwardButton.userInteractionEnabled = NO
    }
    backwardButton.userInteractionEnabled = YES
    let noOfQuestions =  questions.count
    let nextQuestionIndex =  currentQuestionIndex % noOfQuestions
    question.text =  questions[nextQuestionIndex] 
}

Или, если вы хотите, чтобы он вел себя так, как сейчас, просто сделайте это в IBAction для кнопок "вперед" и "назад":

@IBAction func backwardBtnTapped(_ sender: Any) {

    currentQuestionIndex -= 1
    if currentQuestionIndex < 0 {
        currentQuestionIndex = questions.count - 1
    }
    question.text = questions[currentQuestionIndex]
}

@IBAction func forwardBtnTapped(_ sender: Any) {

    currentQuestionIndex += 1
    if currentQuestionIndex >= questions.count {
        currentQuestionIndex = 0
    }
    question.text =  questions[currentQuestionIndex] 
}

Вам нужно проверить состояние.

if currentQuestionIndex > 0{
    let noOfQuestions = questions.count
    let previousQuestionIndex = currentQuestionIndex % noOfQuestions
    question.text = questions[previousQuestionIndex]
  }

Попробуйте, как это может быть полезным

@IBAction func backwardBtnTapped(_ sender: Any) {

       currentQuestionIndex -= 1
       if currentQuestionIndex < 0
       {
          currentQuestionIndex = questions.count-1
       }
       question.text = questions[currentQuestionIndex]
    }

@IBAction func forwardBtnTapped(_ sender: Any) {

    currentQuestionIndex += 1
    if currentQuestionIndex >= questions.count
    {
       currentQuestionIndex = 0
    }
    question.text =  questions[currentQuestionIndex]
} 
Другие вопросы по тегам