首页 > 解决方案 > IBAction 按钮具有相同的功能。是否可以重构?

问题描述

我正在学习 Swift,我现在正在制作井字游戏。这是游戏的图像,到目前为止一切正常。井字游戏的图像。但是,我想知道是否有办法重构代码。

我为每个按钮添加了一个盘子图像(所以你可以看到 3 X 3 个按钮),所以当用户点击按钮时,盘子图像变成苹果图像或菠萝图像。在下面的代码中,我为每个按钮创建了 IBAction(即 func plate1Pressed()),但每个 IBAction 都执行相同的函数,即changePlateImage(plate: sender). 到目前为止,我总共只有 9 个按钮,所以我可以做 9 次 IBAction 并放入changePlateImage(plate: sender)它们,但是,我在想如果我必须制作更多像黑白棋这样的方形游戏,我必须制作 8 X 8 IBAction,这有点可怕……

那么有什么方法可以重构我的代码吗?而不是添加 IBActions 9 次并将相同的功能放入其中?

import UIKit

class GameScreenViewController: UIViewController {

var isPlayer1 = true

override func viewDidLoad() {
    super.viewDidLoad()
}



// when player 1 taped a button, change isPlayer1 to flase


func displayHandPointer () {
    // some codes here...
}


func chnagePlayerTurn () {
    // some codes here...
}




func changePlateImage (plate: UIButton) {

    let fruitImage = isPlayer1 ? K.Image.apple : K.Image.pineapple

    plate.setImage(UIImage(named: fruitImage), for: .normal)

    chnagePlayerTurn()
    displayHandPointer()
}





//MARK: - IBA actions for board game

@IBAction func plate1Pressed(_ sender: UIButton) {
    changePlateImage(plate: sender)
}


@IBAction func plate2Pressed(_ sender: UIButton) {
    changePlateImage(plate: sender)
}


@IBAction func plate3Pressed(_ sender: UIButton) {
    
    changePlateImage(plate: sender)
}


@IBAction func plate4Pressed(_ sender: UIButton) {
    changePlateImage(plate: sender)
}


@IBAction func plate5Pressed(_ sender: UIButton) {
    changePlateImage(plate: sender)
}


@IBAction func plate6Pressed(_ sender: UIButton) {
    changePlateImage(plate: sender)
}


@IBAction func plate7Pressed(_ sender: UIButton) {
    changePlateImage(plate: sender)
}


@IBAction func plate8Pressed(_ sender: UIButton) {
    changePlateImage(plate: sender)
}

@IBAction func plate9Pressed(_ sender: UIButton) {
    changePlateImage(plate: sender)
}

// and codes go on...

}

标签: iosswiftxcodeibaction

解决方案


您可以对所有 UIButtons 使用相同的 IBAction,然后使用标签来了解您正在按下哪些按钮。

@IBAction func platePressed(_ sender: Any) {
    let button = sender as! UIButton
    if button.tag == 1 {
        // do something
    }
}

可以在界面构建器中设置视图标签 在此处输入图像描述


推荐阅读