IBAction 按钮具有相同的功能。有可能重构吗?
IBAction Buttons have same functionality. Is it possible to refactor?
我正在学习 Swift,我现在正在制作井字游戏。这是游戏的图像,到目前为止一切正常。image of tic-tac-toe。但是,我想知道是否有重构代码的方法。
我为每个按钮添加了一个盘子图像(所以你可以看到 3 X 3 个按钮),所以当用户点击按钮时,盘子图像变成苹果图像或菠萝图像。
在下面的代码中,我为每个按钮创建了 IBAction(即 func plate1Pressed()),但每个 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
}
}
可以在界面生成器中设置视图标签
您不需要创建 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
}
我正在学习 Swift,我现在正在制作井字游戏。这是游戏的图像,到目前为止一切正常。image of tic-tac-toe。但是,我想知道是否有重构代码的方法。
我为每个按钮添加了一个盘子图像(所以你可以看到 3 X 3 个按钮),所以当用户点击按钮时,盘子图像变成苹果图像或菠萝图像。
在下面的代码中,我为每个按钮创建了 IBAction(即 func plate1Pressed()),但每个 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
}
}
可以在界面生成器中设置视图标签
您不需要创建 9 个 IBAction 来执行此操作。 sender
是点击时作为参数传入的,每次点击不同的板块都不一样
所以调用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
}