Вот код @IBAction func
@IBAction func touchCard(_ sender: UIButton) {
flipCount += 1
if let index = buttonCollection.firstIndex(of: sender) {
game.chooseCard(at: index)
updateViewFromModel() // I set breakpoint at here
}
}
Файл Concentration.swift, часть модели MVC
class Concentration {
var cards = [Card]()
var numberOfPairsOfCards: Int
var identifierOfOneAndOnlyOneCard: Int? {
didSet {
print("identifierOfOneAndOnlyOneCard: \(identifierOfOneAndOnlyOneCard)")
}
}
init(numberOfPairsOfCards: Int) {
self.numberOfPairsOfCards = numberOfPairsOfCards
for _ in 0..<numberOfPairsOfCards {
let card = Card()
cards += [card, card]
}
}
func chooseCard(at Index: Int) {
print("Index: \(Index)")
if !cards[Index].isMatched {
if let matchIndex = identifierOfOneAndOnlyOneCard, matchIndex != Index {
// check if cards match
if cards[matchIndex].identifier == cards[Index].identifier {
cards[matchIndex].isMatched = true
cards[Index].isMatched = true
}
cards[Index].isFaceUp = true
identifierOfOneAndOnlyOneCard = nil
} else {
// either no cards or 2 cards are face up
for flipDownIndex in cards.indices {
cards[flipDownIndex].isFaceUp = false
}
cards[Index].isFaceUp = true
identifierOfOneAndOnlyOneCard = Index
}
}
}
}
код функции updateViewFromModel ()
Файл Card.swift, часть модели MVC
struct Card {
var isFaceUp: Bool = false
var isMatched: Bool = false
var identifier = getUniqueIdentifier()
static var uniqueIdentifier: Int = 0
static func getUniqueIdentifier() -> Int{
uniqueIdentifier += 1
return uniqueIdentifier
}
}
Этот код является частью игры концентрации проекта из CS193p.
Когда я пошагово отследил код,Я нашел что-то непонятное.
- Как упоминалось ранее, я установил точку останова на строке updateViewFromModel () в @IBAction func touchCard (_ sender: UIButton)
- Затем я нажал 'Кнопка «Выполнить» Xcode
- Вышел симулятор iPhone.
- изображение пользовательского интерфейса по умолчанию без какого-либо нажатия
- Я нажал первую 'карту' (собственно, кнопка) слева направо в первом ряду
- Xcode реагировал , а пользовательский интерфейс остался таким же, как по умолчанию
- Я начал отлаживать код с помощью LLDB, иЯ вошел в func updateViewFromModel ()
- Когда я перешел к строке 64 , это показало, что isFaceUp первой карты верен, потому что я только что щелкнул эту карту.
- Давайте продолжим, Я перешел к строке 68 .Строки 65 и 66 должны быть выполнены!Я думаю, что при выполнении строк 65 и 66 пользовательский интерфейс должен измениться. Но почему пользовательский интерфейс не обновился своевременно?
- Я закончил выполнение левого кода в func updateViewFromModel, потому что я этого не сделалнажмите любую другую карту.
- Наконец-то дошло до конца @IBAction func touchCard , пользовательский интерфейс остался таким же, как по умолчанию.
- Я нажал кнопку «Продолжить выполнение программы», пользовательский интерфейс ответил правильно . Мне было так странно.
Я хочу выяснить, что на шаге 9 почему пользовательский интерфейс не обновлялся своевременно.
Iбуду очень признателен за вашу помощь!