Почему пользовательский интерфейс не обновлялся своевременно при использовании функции @IBAction? - PullRequest
0 голосов
/ 07 марта 2019

Вот код @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.
Когда я пошагово отследил код,Я нашел что-то непонятное.

  1. Как упоминалось ранее, я установил точку останова на строке updateViewFromModel () в @IBAction func touchCard (_ sender: UIButton)
  2. Затем я нажал 'Кнопка «Выполнить» Xcode
  3. Вышел симулятор iPhone.
  4. изображение пользовательского интерфейса по умолчанию без какого-либо нажатия
  5. Я нажал первую 'карту' (собственно, кнопка) слева направо в первом ряду
  6. Xcode реагировал , а пользовательский интерфейс остался таким же, как по умолчанию
  7. Я начал отлаживать код с помощью LLDB, иЯ вошел в func updateViewFromModel ()
  8. Когда я перешел к строке 64 , это показало, что isFaceUp первой карты верен, потому что я только что щелкнул эту карту.
  9. Давайте продолжим, Я перешел к строке 68 .Строки 65 и 66 должны быть выполнены!Я думаю, что при выполнении строк 65 и 66 пользовательский интерфейс должен измениться. Но почему пользовательский интерфейс не обновился своевременно?
  10. Я закончил выполнение левого кода в func updateViewFromModel, потому что я этого не сделалнажмите любую другую карту.
  11. Наконец-то дошло до конца @IBAction func touchCard , пользовательский интерфейс остался таким же, как по умолчанию.
  12. Я нажал кнопку «Продолжить выполнение программы», пользовательский интерфейс ответил правильно . Мне было так странно.

Я хочу выяснить, что на шаге 9 почему пользовательский интерфейс не обновлялся своевременно.

Iбуду очень признателен за вашу помощь!

Ответы [ 2 ]

1 голос
/ 07 марта 2019

Когда вы вносите изменения в представление, он ожидает цикла перерисовки, поэтому представление не будет обновлено немедленно.В IBAction нет ничего плохого: вы помещаете изменения в другое место и устанавливаете точку останова, это не будет иметь никакого значения.

0 голосов
/ 07 марта 2019

Это может быть связано с медленными симуляторами, так как я также сталкиваюсь с проблемой медленных симуляторов, я не знаю, сталкивался ли кто-то еще с этим или нет, я сомневаюсь, что вы столкнулись с этой проблемой, но я не уверен.

1- Нет ничего плохого в том, что ваш код обновляет ваши симуляторы при работе с Xcode 9.2 и симуляторами IOS11.

2 - Попробуйте на вашем устройстве

...