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