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

如何在SecondViewController中访问另一个文件中定义的Objective-C风格handleTap()方法

解决方法:访问Button类中的handleTap方法

你的问题核心是当前给按钮绑定点击事件时,target指向了SecondViewController,但handleTap方法属于Button类本身,所以会导致运行时找不到方法的崩溃。下面给你两种符合需求的方案,都能保留handleTap在Button.swift文件中:

方案1:让按钮自身处理点击事件(最直接)

既然handleTap是Button类的方法,那直接把点击事件的响应者设为按钮实例本身就可以了,不需要改动Button.swift的代码,只需要修改SecondViewController里的按钮初始化代码:

var circle: Button = {
    let button = Button()
    // 将target从self(SecondViewController实例)改为button自身
    button.addTarget(button, action: #selector(Button.handleTap), for: .touchUpInside)
    return button
}()

这样点击按钮时,系统会自动调用该Button实例的handleTap方法,完全满足你要保留方法在原文件的需求。

方案2:在SecondViewController中主动调用该方法(如果需要)

如果你需要在SecondViewController的其他逻辑里主动触发handleTap的逻辑,可以把handleTap的访问权限公开,然后直接通过按钮实例调用:

步骤1:修改Button.swift中的方法权限

把handleTap的访问修饰符改为public(如果你的代码都在同一个App模块里,其实internal默认权限也能访问,但明确标注更清晰):

@objc public func handleTap(sender: UIButton) {
    // 原方法逻辑保持不变
}

步骤2:在SecondViewController中调用

在需要的地方直接通过circle实例调用该方法:

// 比如在某个按钮点击或者生命周期方法里调用
func triggerButtonTap() {
    circle.handleTap(sender: circle)
}

至于你提到的给SecondViewController加extension来包含handleTap,其实完全没必要——因为这个方法的逻辑是和Button的状态(done、toDo、shapeLayer等)强绑定的,放在Button类里才是符合面向对象设计的,强行移到extension反而会破坏代码的封装性。

内容的提问来源于stack exchange,提问作者Blake Byers

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 14:02:43