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

Swift Xcode13.1中点击UIButton后移除该按钮的实现方法

解决方法:通过Selector获取点击按钮并替换

你现在的核心问题是removeButton方法拿不到被点击的按钮实例,所以没法对它进行移除操作。Swift里的Selector支持带参数,直接把触发事件的按钮传进来就能解决,具体步骤如下:

1. 修改方法签名与Target绑定

先把removeButton改成接收UIButton类型参数的版本,同时更新addTarget里的action绑定:

func addNewPlayerButton(x: CGFloat, y: CGFloat, width: CGFloat, height: CGFloat, view: UIView, color: UIColor) {
    let startButton = UIButton()
    startButton.frame.size.width = width
    startButton.frame.size.height = height
    startButton.center = CGPoint(x: x, y: y)
    
    startButton.backgroundColor = color
    startButton.setBackgroundImage(UIImage(named: "can_add"), for: .normal)
    
    // 绑定带参数的Selector
    startButton.addTarget(self,
                     action: #selector(removeButton(_:)),
                     for: .touchUpInside)
    
    view.addSubview(startButton)
}

@objc
// 接收sender参数,就是被点击的按钮本身
func removeButton(_ sender: UIButton) {
    // 1. 移除当前按钮
    sender.removeFromSuperview()
    
    // 2. 获取原按钮的位置、尺寸和父视图
    guard let parentView = sender.superview else { return }
    let center = sender.center
    let width = sender.frame.width
    let height = sender.frame.height
    
    // 3. 在原位置创建新按钮(这里复用你的方法,也可直接创建新按钮)
    // 示例:换个颜色区分新按钮
    addNewPlayerButton(x: center.x, y: center.y, width: width, height: height, view: parentView, color: .systemBlue)
}

2. 关键细节说明

  • sender就是触发点击事件的按钮实例,通过它能直接获取按钮的位置、尺寸、父视图等所有属性
  • 如果新按钮的逻辑和原按钮不同,不用复用addNewPlayerButton,直接在removeButton里创建新的UIButton,设置相同的frame和center后添加到parentView即可
  • 必须判断sender.superview是否存在,避免空值导致的崩溃

内容的提问来源于stack exchange,提问作者Andrew Seaman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 20:24:30