无法获取 Swift 中两个 NSDate() 实例之间的时间间隔

Trouble getting time interval between two NSDate() instances in Swift

我对 Swift 比较陌生。我正在开发一个严重依赖 UITextView 的移动应用程序。我想要的行为是当用户快速双击 space 栏时,光标将向前跳 5 space 秒。我试图通过使用 NSDate() 计时 space 按下之间的间隔来完成此操作,但没有成功。我能够检测到双击,但无法检测到快速(0.1 秒以下)。希望对我在这里做错的事情有所帮助。

更新:我认为问题出在逻辑上。 spaceTime 和 timeTwo 似乎总是接近相同的值。我想我想知道如何在按一次 space 后使 spaceTime 成为一个静态数字。

我的代码如下:

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
    }
}

你的逻辑完全错了。您需要检查用户是否点击了 space 并保存发生这种情况的时间。然后你需要检查前一个字符是否也是一个 space 并将最近的时间与之前的时间进行比较。

类似于以下内容:

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

首先我会扩展 Date 以添加下面的功能。

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
}