import UIKitclass VIEwController: UIVIEwController,EqFIEldDelegate {overrIDe func vIEwDIDLoad() { super.vIEwDIDLoad() let newFIEld = EqFIEld() newFIEld.myDelegate = self newFIEld.becomeFirstResponder() vIEw.addSubvIEw(newFIEld) newFIEld.frame = CGRect(x: 50,y: 50,wIDth: 200,height: 150)}func backspacepressed( ){ print("in backspacepressed") // breakpoint added here}}
这是UITextFIEld的子类:
import UIKitclass EqFIEld: UITextFIEld { var myDelegate: EqFIEldDelegate? overrIDe func deleteBackward() { super.deleteBackward() myDelegate?.backspacepressed() }}protocol EqFIEldDelegate { func backspacepressed()}解决方法 我有一个关于为什么会这样的理论.
为了说明,想象一下我们正在制作自己的后退按钮.它应具有以下行为来模仿Apple的:
>触摸时,调用backspacepressed
> 0.5秒后,如果触摸仍然按下,请再次调用backspacepressed
>每隔0.1秒后,请再次调用backspacepressed
以下是我将如何实现它:
>将其添加到vIEwDIDLoad的末尾
let button = UIbutton(type: .system)button.setTitle("Tap Me",for: .normal)button.addTarget(self,action: #selector(VIEwController.handlebuttontouched(button:)),for: .touchDown)button.addTarget(self,action: #selector(VIEwController.handlebuttonReleased(button:)),for: .touchUpInsIDe)button.frame = CGRect(x: 50,y: newFIEld.frame.maxY,height: 150)vIEw.addSubvIEw(button)
>在vIEwDIDLoad之后添加
var buttonTimer: Timer?func handlebuttontouched(button: UIbutton) { buttonTimer = Timer.scheduledTimer(withTimeInterval: 1.0,repeats: false,block: { [weak self] timer in print("button's been held down for a while!") self?.backspacepressed() self?.buttonTimer = Timer.scheduledTimer(withTimeInterval: 0.1,repeats: true,block: { (timer) in print("button's still held down") self?.backspacepressed() }) }) print("button was pressed") // add a breakpoint here self.backspacepressed()}func handlebuttonReleased(button: UIbutton) { buttonTimer?.invalIDate()}
>(可选)注释掉您的日志,以便您的控制台与我的实验相匹配
func backspacepressed( ){ //print("in backspacepressed")}
没有断点,如果点击并按住此按钮,您将按照上面概述的行为打印日志:
button was pressedbutton's been held down for a while!button's still held downbutton's still held downbutton's still held downbutton's still held down
如果你只是点击按钮(不要按住它),你就会得到
button was pressed
但是,如果您设置了断点,请点击按钮,并在断点点击之后等待一秒钟,然后再按“继续”,您将获得两个日志:
button was pressedbutton's been held down for a while!
你会想,既然你没有按住按钮足够长的时间,你就不会得到第二个日志.发生的事情是,即使您在断点处停止,计时器也会下降,并且当执行返回到程序时,计时器的结果将在评估按钮释放之前进行评估.
我不确定为什么事情按此顺序发生 – 为什么在定时器事件之前不能处理按钮释放?但是你可以看到,在没有断点的正常执行中,它甚至不是先发生什么的问题 – 短按钮点击将导致在定时器关闭之前调用handlebuttonReleased.
我怀疑在你的情况下,Apple的键盘正在做类似的事情,并且你设置了一个断点,让你的触摸停滞不前,而某个计时器决定是的,这确实是一个长期的新闻!即使它确实不是.我没有一个解决方法,但希望这会对正在发生的事情有所启发.
总结以上是内存溢出为你收集整理的在Xcode 8.1 / Swift 3.0中使用调试器断点调用两次Delegate方法全部内容,希望文章能够帮你解决在Xcode 8.1 / Swift 3.0中使用调试器断点调用两次Delegate方法所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)