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