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

时间:2017-05-02 14:46:11

标签: ios swift time nsdate intervals

我对Swift来说比较新。我正在开发一款严重依赖UITextView的移动应用。我想要的行为是当用户快速双击空格键时,光标将向前跳5个空格。我试图通过使用NSDate()计算空间按下之间的间隔来完成此操作,但是没有成功。我能够检测到双击,但是无法检测到快速(低于0.1秒)。我会在这里做错了一些帮助。

更新:我认为问题在于逻辑。 spaceTime和timeTwo似乎总是接近相同的值。我想我想知道如何在单个空格按下后使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
    }
}

2 个答案:

答案 0 :(得分:0)

你的逻辑是错的。您需要检查用户是否已点击空格并节省发生这种情况的时间。然后你需要检查前一个字符是否也是一个空格,并将最新时间与前一个时间进行比较。

如下所示:

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

答案 1 :(得分:0)

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

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
}