Swift开发:用UIButton替代UIImage做骰子遇参数匹配错误
嘿,我来帮你搞定这个问题!你遇到的Argument labels '(named:)' do not match any available overloads错误,核心原因是把UIImage的初始化逻辑直接套在了UIButton上——UIButton根本没有init(named:)这个构造方法,而且你的代码还有几个小坑,我一步步给你捋清楚:
首先,修复两个致命小问题
1. 数组定义错误
你之前的stenenArray把所有骰子图片文件名都塞进了一个字符串里,导致数组其实只有1个元素,后续取索引1-5的时候会直接崩溃!正确的写法应该是每个文件名单独作为数组元素:
let stenenArray = ["Steen1", "Steen2", "Steen3", "Steen4", "Steen5", "Steen6"]
2. 错误地重新初始化IBOutlet按钮
dice1和dice2是你从Storyboard拖过来的IBOutlet,它们已经是现成的UIButton实例了,不需要(也不能)用UIButton(named:)重新赋值。你要做的是给已有的按钮设置图片,而不是重新创建按钮。
修正后的基础功能代码
下面是修复后的代码,我还帮你调整了随机数生成的顺序(先生成随机索引再设置图片,第一次运行就能显示随机骰子):
import UIKit class ViewController: UIViewController { @IBOutlet weak var dice1: UIButton! @IBOutlet weak var dice2: UIButton! // 修复后的图片数组 let stenenArray = ["Steen1", "Steen2", "Steen3", "Steen4", "Steen5", "Steen6"] override func viewDidLoad() { super.viewDidLoad() // 可选:启动时就显示随机骰子 updateDiceImages() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } @IBAction func buttonPressed(_ sender: Any) { updateDiceImages() } func updateDiceImages(){ // 先生成随机索引,再获取图片 let randomDiceIndex1 = Int(arc4random_uniform(6)) let randomDiceIndex2 = Int(arc4random_uniform(6)) // 给UIButton设置图片:先用UIImage(named:)加载图片,再通过setImage方法赋值 if let diceImage1 = UIImage(named: stenenArray[randomDiceIndex1]) { dice1.setImage(diceImage1, for: .normal) } if let diceImage2 = UIImage(named: stenenArray[randomDiceIndex2]) { dice2.setImage(diceImage2, for: .normal) } } }
实现你的核心需求:点击骰子保留当前回合
既然你想用UIButton实现“点击保留骰子”的功能,只需给每个骰子按钮添加点击事件,切换它的选中状态,然后在更新骰子时跳过已选中的按钮即可:
1. 添加骰子点击事件方法
在ViewController里新增一个方法:
@IBAction func diceTapped(_ sender: UIButton) { // 切换选中状态 sender.isSelected.toggle() // 可选:给选中的骰子加个边框提示用户 sender.layer.borderWidth = sender.isSelected ? 2 : 0 sender.layer.borderColor = UIColor.red.cgColor }
2. 修改updateDiceImages方法
更新骰子时,只改动未被选中的骰子:
func updateDiceImages(){ // 只更新未选中的骰子1 if !dice1.isSelected { let randomDiceIndex1 = Int(arc4random_uniform(6)) if let diceImage1 = UIImage(named: stenenArray[randomDiceIndex1]) { dice1.setImage(diceImage1, for: .normal) } } // 只更新未选中的骰子2 if !dice2.isSelected { let randomDiceIndex2 = Int(arc4random_uniform(6)) if let diceImage2 = UIImage(named: stenenArray[randomDiceIndex2]) { dice2.setImage(diceImage2, for: .normal) } } }
3. 连接Storyboard事件
最后回到Storyboard,把dice1和dice2的Touch Up Inside事件都连接到刚才的diceTapped方法上,这样点击骰子就能切换保留状态啦!
内容的提问来源于stack exchange,提问作者G.Venem
相关产品推荐
相关产品推荐

