如何创建一个空闲计时器来检测UITextView中的编辑活动

时间:2015-11-16 22:14:10

标签: ios grand-central-dispatch dispatch

我希望允许用户在关闭应用之前在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'也会运行。我想我需要取消发送请求并发出一个新请求,但我该怎么做?

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

1 个答案:

答案 0 :(得分:1)

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

使用NSTimer执行此操作最简单,因为现在您有一个可以保持引用的对象(例如,实例属性)。当用户键入内容时,您将使计时器无效并将引用设置为nil。现在它消失了!现在创建一个新的并设置它的引用。等等。