无法获取 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
}
我对 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
}