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
相关产品推荐
相关产品推荐

