为什么使用@IBAction func时UI不能及时更新?

时间:2019-03-07 02:12:47

标签: ios swift ibaction

这是@IBAction函数的代码

@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
        }
    }
}
}

the code of func 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. 如前所述,我在 @IBAction函数touchCard(_ sender中的updateViewFromModel(): UIButton)
  2. 然后我点击了Xcode的“运行”按钮
  3. iPhone模拟器问世了。
  4. the default UI image without any clicking
  5. 我在第一行中从左到右单击了第一个“卡片”(实际上是一个按钮)
  6. Xcode reacted,并且用户界面与默认界面相同
  7. 我开始使用LLDB调试代码,然后进入func updateViewFromModel()
  8. When I stepped over to Line 64,它表明第一张卡片的isFaceUp是正确的,因为我刚刚单击了这张卡片。
  9. 让我们继续,I stepped over to Line 68。必须执行第65和66行!我认为是在执行第65和66行时, UI应该会发生变化。但是,为什么UI没有及时更新?
  10. 我完成了func updateViewFromModel中剩下的代码,因为我没有单击任何其他卡。
  11. Finally it came to the end of @IBAction func touchCard,UI仍与默认设置相同。
  12. 我点击了“继续执行程序”按钮the UI responded correctly。我觉得很奇怪。

我想弄清楚的是,在第9步中,为什么UI没有及时更新。

非常感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

在视图上进行更改时,它会等待重绘周期,因此视图不会立即更新。 IBAction没什么问题,您将更改放在其他位置并设置断点,不会有任何区别。

答案 1 :(得分:0)

这可能是由于模拟器速度慢,因为我也遇到了模拟器速度慢的问题,我不知道是否有人也遇到了这个问题,我怀疑您是否遇到了这个问题,但是我不确定。

1-使用Xcode 9.2和IOS11的模拟器时,代码没有问题,可以更新模拟器。

2-在您的设备上尝试一下