如何在SecondViewController中访问另一个文件中定义的Objective-C风格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
相关产品推荐
相关产品推荐

