【问题标题】:How to make a idle timer that detects editing activity in a UITextView如何制作一个空闲计时器来检测 UITextView 中的编辑活动
【发布时间】:2015-11-16 22:14:10
【问题描述】:

我想允许用户在关闭应用程序之前在 UITextView 中输入一些注释。但是他/她可能没有输入任何内容,或者他/她可能输入了一些文本然后停止并且很长时间什么也不做。在任何一种情况下,我都想关闭 UITextView,保存一些东西,然后退出应用程序。如何检测到用户在一定秒数内没有输入任何内容?

我试图在等待一段时间后调度一个函数

static int idleSeconds = 8;

self.noteDoneTime = dispatch_time(DISPATCH_TIME_NOW, NSEC_PER_SEC * idleSeconds);
dispatch_after(self.noteDoneTime, dispatch_get_main_queue(), ^{ [self endNoteRequest]; });

但每次用户更改文本时都会更新调度时间:

- (void)textViewDidChange:(UITextView *)textView {
    if (textView == self.noteView) {
        self.noteDoneTime = dispatch_time(DISPATCH_TIME_NOW, NSEC_PER_SEC * idleSeconds);
    }
}

但这不起作用,因为调度时间在初始设置后没有得到更新,所以即使用户继续编辑文本,方法“endNoteRequest”也会运行。我想我需要取消调度请求并发出一个新请求,但我该怎么做呢?

或者是否有其他实际有效的空闲超时方法?

【问题讨论】:

    标签: ios grand-central-dispatch dispatch


    【解决方案1】:

    我在游戏应用程序中做了类似的事情,我在用户没有进行任何游戏动作的情况下每 10 秒对用户进行一次惩罚。这就像篮球中的“投篮时钟”,每次投篮后都会重置。

    使用 NSTimer 最容易做到这一点,因为现在您有了一个可以保留引用的对象(例如,实例属性)。当用户键入某些内容时,您会使计时器无效并将您的引用设置为 nil。现在它消失了!现在新建一个并设置对它的引用。以此类推。

    【讨论】:

    • 谢谢。我想到了这一点,但我在文档中的某处看到 NSTimers 耗能大,只能作为最后的手段使用,而我们应该使用调度方法。但也许 NSTimer 是唯一的方法。我真的很想找到一种方法来取消调度请求。我会等待一段时间,看看是否有人回答有关取消调度请求或更新其触发时间的信息。
    • 我刚刚看到问题 15005452,它看起来像是一种重新安排调度请求的方法。今晚晚些时候我会调查的。
    • 我在这里有一个可取消的调度计时器类:github.com/mattneub/Programming-iOS-Book-Examples/blob/master/… 但我认为对 NSTimer 的“能量饥渴”反对是无稽之谈。
    • 您的可取消调度计时器工作得非常好!谢谢你。由于可取消计时器,我接受了您的回答。
    猜你喜欢
    • 1970-01-01
    • 2018-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-25
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多