在Swift中的两个NSDATE()实例之间获得时间间隔



我对Swift相对较新。我正在严重依赖于UitextView的移动应用程序。我所需的行为是当用户快速对空格键进行双重点击时,光标将跳到5个空间。我试图通过使用nsdate((将空间压力之间的间隔定为时间来实现这一目标,但没有成功。我能够检测到双水龙头,但无法检测到一个快速的水龙头(0.1秒以下(。我会喜欢在这里做错什么的帮助。

更新:我认为问题是逻辑。时空和时间表似乎总是接近相同的值。我想我想知道如何在单个空间按下之后使时空成为静态数字。

我的代码如下:

class ViewController: UIViewController, UITextViewDelegate {
    func characterBeforeCursor()->String?
    {
        if let cursorRange=mainTextBox.selectedTextRange
        {
            if let newPosition = mainTextBox.position(from: cursorRange.start, offset: -1) {
                let range = mainTextBox.textRange(from: newPosition, to: cursorRange.start)
                return mainTextBox.text(in: range!)
            }
        }
        return nil
    }
    func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
        if text==" "
        {
            let spaceTime=NSDate().timeIntervalSince1970
            if characterBeforeCursor()==" "
            {
                let timeTwo=NSDate().timeIntervalSince1970
                if(Double(timeTwo)-Double(spaceTime)>0.1)
                {
                    mainTextBox.text="it worked"
                }
                mainTextBox.text="hello"
            }
        }
        mainTextBox.textColor=UIColor.green
        return true
    }
}

您的逻辑都是错误的。您需要检查用户是否挖掘了一个空间并节省了这种情况。然后,您需要检查上一个字符是否也是一个空间,并将最新时间与以前的时间进行比较。

类似以下内容:

class ViewController: UIViewController, UITextViewDelegate {
    var previousSpaceTimestamp: Date?
    func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
        if text == " " {
            let now = Date()
            if let last = previousSpaceTimestamp {
                if now.timeIntervalSince(last) < 0.1 {
                    // User has tapped two spaces in less than 0.1 seconds
                    // update text field as desired
                    return false
                }
            }
            // Store time of this space
            previousSpaceTimestamp = now
        } else {
            // Not a space, reset timestamp
            previousSpaceTimestamp = nil
        }
        return true
    }
}

请注意,您的characterBeforeCursor方法不需要。

还要注意,您应该使用Date,而不是NSDate

首先,我将延长日期以添加下面的函数。

extension Date {
  // Returns the amount of nanoseconds from another date
  func nanoSeconds(from date: Date) -> Int {
    return Calendar.current.dateComponents([.nanosecond], from: date, to: self).nanosecond ?? 0
  }

接下来尝试下面的代码。

var previousTapDate: Date?
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
    if text==" " {
        let spaceTime = Date()
        if characterBeforeCursor() == " " {
              if previousTapDate == nil {
                    previousTapDate = dateNow
                  } else {
                    let timeDifference = spaceTime.nanoSeconds(from: previousTapDate!)
                     if timeDifference <= 10000000 {
                        mainTextBox.text="it worked"
                        } else {
                        mainTextBox.text="hello"
                        }
                      }
                    }
    previousTapDate = spaceTime
    mainTextBox.textColor=UIColor.green
    return true
}

最新更新