#swift #xcode #uiviewcontroller #segue
#быстрый #xcode #uiviewcontroller #segue
Вопрос:
У меня есть PopupViewController, который вызывает функцию из моего GameViewController, которая до сих пор работала идеально.
//from my game view controller for i in 0...6 { imagesAll[i].setImage(nil, for: .normal) } if cardIndex != 0 { for i in 0...cardIndex - 1 { imagesAll[i].setImage(cards.map({$0.image})[i], for: .normal) } }
Я тестировал этот код сотни раз, и он был в порядке. Это часть моей функции reset() моего контроллера GameViewController. В моем PopupViewController я вызываю функцию gameVC.removingCard() с параметрами
//in my popup view controller @IBAction func removePressed(_ sender: UIButton) { dismiss(animated: true, completion: nil) gameVC.removingCard(indexToRemove: index!) }
который содержит функцию resetImages() с параметрами
func removingCard(indexToRemove: Int) { ... ... ... resetImages(cards: myDeck) ... ... ... }
и когда он вызывается, теперь я получаю ошибку out of index, которую я не получал за недели тестирования кода. Есть ли что-то, что я делаю неправильно при вызове этого кода из другого VC? Я знаю, что с этим кодом не так много работы, но, возможно, я упускаю что-то очевидное.
{ let parentsOne = cards.suffix(2) var imagesAll: [UIButton] = [] if isPlayerOneTurn { imagesAll = imageArray } else { imagesAll = imageArray2 } var cardIndex = cards.count - 2 for i in 0...6 { //this line: Out Of Index Error imagesAll[i].setImage(nil, for: .normal) } if cardIndex != 0 { for i in 0...cardIndex - 1 { imagesAll[i].setImage(cards.map({$0.image})[i], for: .normal) } } if gameManager.pileCards.count == 0 { drawingCard.setImage(nil, for: .normal) } else { drawingCard.setImage(gameManager.pileCards.last?.image, for: .normal) } if gameManager.secondPile.count == 0 { secondDraw.setImage(nil, for: .normal) } else { secondDraw.setImage(gameManager.secondPile.last?.image, for: .normal) } if gameManager.studentPile.count == 0 { studentTableCard.setImage(nil, for: .normal) } else { studentTableCard.setImage(gameManager.studentPile.last?.image, for: .normal) } if isPlayerOneTurn { onePParent1.setImage(parentsOne.map({$0.image}).first!, for: .normal) onePParent2.setImage(parentsOne.map({$0.image}).last!, for: .normal) } else { twoPParent1.setImage(parentsOne.map({$0.image}).first!, for: .normal) twoPParent2.setImage(parentsOne.map({$0.image}).last!, for: .normal) } }
Редактировать
Я не удаляю индекс, эта функция просто называется для обозначения определенной карты в позиции индекса массива.
Редактировать
Поэтому после еще более тщательного исследования я обнаруживаю, что при вызове функции из другого контроллера представления кнопки в моем массиве imagesAll не достигаются, они объявляются равными нулю. Почему мои IBOutlets объявлены равными нулю из другого контроллера вида?
Комментарии:
1. вам нужно разорвать цикл после удаления индекса
2. или, если вы удаляете несколько индексов одновременно, сначала измените массив индексов, который вы хотите удалить, и разорвите цикл после последнего удаления индекса
Ответ №1:
вы должны вызвать этот gameVC.removingCard(indexToRemove: индекс!), прежде чем уволить ваш ViewController.
Комментарии:
1. Это комментарий, а не ответ
2. Я пробовал это изначально, это не сработало, но сейчас я все равно напишу функцию перед увольнением
3. Как вы получаете индекс можете ли вы поделиться полным фрагментом своего кода?
4. Я отредактировал код, чтобы включить всю функцию, которая вызывает сбой, отмечена конкретная строка
5. Продолжая что-то пробовать, я заметил, что мой массив кнопок равен нулю вместо 7 IBOutlets, которые я объявил ранее. В то время как мои кнопки равны нулю, когда функция вызывается из другого контроллера представления?