IBAction 按钮具有相同的功能。是不是可以重构?

Posted

技术标签:

【中文标题】IBAction 按钮具有相同的功能。是不是可以重构?【英文标题】:IBAction Buttons have same functionality. Is it possible to refactor?IBAction 按钮具有相同的功能。是否可以重构? 【发布时间】:2020-08-17 02:11:58 【问题描述】:

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

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

那么有什么方法可以重构我的代码吗?而不是将 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...


【问题讨论】:

我相信您可以对所有按钮使用相同的 IBAction。 【参考方案1】:

您无需创建 9 IBAction 即可执行此操作。 sender是敲击时作为参数传入的,每次敲击不同的板块都不一样。

所以调用changePlateImage只需要一个IBAction。

执行以下操作:

Connect plate1 to plate9 to platesPressed IBAction func
@IBAction func platesPressed(_ sender: UIButton) 
    changePlateImage(plate: sender)


func changePlateImage (plate: UIButton) 
    // keep the same code

【讨论】:

谢谢!我在我的代码中只放了一个 IBAction 并与每个按钮连接现在它工作了;)【参考方案2】:

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

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

可以在界面生成器中设置视图标签

【讨论】:

以上是关于IBAction 按钮具有相同的功能。是不是可以重构?的主要内容,如果未能解决你的问题,请参考以下文章

检测按下了哪个按钮

有条件的 IBAction(如果生命 == 1 显示“购买额外生命”按钮)

Objective-C,改变 NSButton 功能?

如何创建一个循环来检查每次迭代时是不是有新的 IBAction 输入?

如何生成具有相同意图但具有另一个 Extra 的多个按钮

单击按钮 jquery 后是不是可以添加相同的现有 dom 结构?