如何制作一个空闲计时器来检测 UITextView 中的编辑 activity

How to make a idle timer that detects editing activity in a UITextView

我想允许用户在关闭应用程序之前在 UITextView 中输入一些注释。但是 he/she 可能不会输入任何内容,或者 he/she 可能会输入一些文本然后停止并且长时间不执行任何操作。在这两种情况下,我都想关闭 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' 也会运行。我想我需要取消派送请求并发出新的派送请求,但我该怎么做?

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

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

使用 NSTimer 最容易做到这一点,因为现在您有了一个可以引用的对象(例如实例 属性)。当用户键入内容时,您使计时器无效并将您的引用设置为 nil。现在它不见了!现在制作一个新的并设置对它的引用。等等。