微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

IBAction按钮具有相同的功能可以重构吗?

如何解决IBAction按钮具有相同的功能可以重构吗?

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

我在每个按钮上添加一个盘子图像(因此您可以看到3 X 3个按钮),因此当用户点击按钮时,盘子图像将变成苹果图像或菠萝图像。 在下面的代码中,我为每个按钮(即func plate1pressed())创建了IBAction,但是每个IBAction都执行相同的功能,即changePlateImage(plate: sender)。到目前为止,我总共只有9个按钮,所以我只能做9次IBAction并将changePlateImage(plate: sender)放进去,但是,我在想如果我必须做更多像reversi的方形游戏,我必须做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...

}

解决方法

您可以对所有UIButton使用相同的IBAction,然后使用标签知道您要按下的按钮。

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

可以在界面构建器中设置查看标签 enter image description here

,

您无需创建9 IBAction即可。敲击sender时将其作为参数传递,每次敲击不同的印版时,参数都会不同。

因此,只需一个IBAction即可调用changePlateImage

执行以下操作:

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。