【问题标题】:Performing an action on end editing在结束编辑时执行操作
【发布时间】:2011-05-18 01:59:55
【问题描述】:

我的 Objective-C Mac 应用程序中有一个文本字段。

这就是我想要的:当我停止在文本字段中书写超过 5 秒时,它会运行一些东西。这可能吗?

如果是这样,有人可以解释一下吗?

【问题讨论】:

    标签: objective-c cocoa macos nstextfield


    【解决方案1】:
    1. 确保您的文本字段的连续选项已打开。
    2. 将文本字段的委托连接到您的控制器。
    3. 在您的控制器中实现controlTextDidChange:。
    4. 每次收到controlTextDidChange: 时启动一个计时器(并使旧计时器失效)。

    这是一个例子:

    - (void)controlTextDidChange:(NSNotification *)notification
    {
       if (timeoutTimer != nil) {
          [timeoutTimer invalidate];
          [timeoutTimer release];
          timeoutTimer = nil;
       }
    
       timeoutTimer = [[NSTimer 
          scheduledTimerWithTimeInterval:5.0
          target:self
          selector:@selector(doSomething)
          userInfo:nil
          repeats:NO] retain];
    }
    

    【讨论】:

    • 很抱歉,如果我在这方面完全是新手,请指导我到一个解释如何在控制器中实现的地方?
    • 并将我的文本字段委托连接到控制器?
    • 尝试将该代码粘贴到控制器类的实现中的某个位置(即以“.m”结尾的文件)。要使您的控制器成为文本字段的委托,请右键单击并从文本字段拖动到 Interface Builder 中的控制器。在询问连接哪个插座时选择delegate。
    • 太棒了!非常感谢!
    【解决方案2】:

    使用-performSelector:withObject:afterDelay:,如果用户再次开始输入,则取消执行请求。这是一个粗略的例子:

    - ( void )controlTextDidChange: (NSNotification *)notification
    {
        if ( [ notification object ] != myTextField ) {
            return;
        }
    
        [ NSObject cancelPreviousPerformRequestsWithTarget: self
                   selector: @selector( userStoppedEditing: )
                   object: myTextField ];
        [ self performSelector: @selector( userStoppedEditing: )
               withObject: myTextField
               afterDelay: 5.0 ];
    }
    

    【讨论】:

      猜你喜欢
      • 2012-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-20
      • 2016-03-31
      • 1970-01-01
      • 2019-05-29
      • 2017-10-17
      相关资源
      最近更新 更多