You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift开发:用UIButton替代UIImage做骰子遇参数匹配错误

解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:33:51