如何解决根据两次“ onTap”之间的持续时间触发2种不同的操作
对于一个按钮,每次轻按一次,在少于60秒前发生“ onTap”时如何触发code1(将特定var设置为value1),而在onTap发生更多时如何触发code2(将特定变量设置为value2)超过60秒前?
==>实施的工作解决方案持续时间= 10秒
Button(action: {
self.date = Date()
let hour = self.calendar.component(.hour,from: self.date)
let minutes = self.calendar.component(.minute,from: self.date)
let seconds = self.calendar.component(.second,from: self.date)
self.newdate = hour*3600+minutes*60+seconds
if (self.lastdate == 0){
print(" First Tap...")
}else
if (self.newdate-self.lastdate) < 10 {
print("Tap before 10 sec => call Func1")
} else {
print("Tap > 10 seconds => call Func2")
}
self.lastdate = hour*3600+minutes*60+seconds
}) {
Text("One")
}
解决方法
var lastTapTimestamp: Date?
@IBAction func buttonTapped(_ sender: UIButton) {
defer { lastTapTimestamp = Date() }
guard let date = lastTapTimestamp else {
callFunc1()
return
}
if Int(Date().timeIntervalSinceReferenceDate) - Int(date.timeIntervalSinceReferenceDate) >= 3600 {
callFunc2()
} else {
callFunc1()
}
}
,
这是一个完整的示例,其运行时间为5秒(以使测试更快)。
它使用@State
变量来更新Date
和lastTap
中的message
,并使用.timeIntervalSince(last)
以秒为单位测量时间。当lastTap
仍为nil
时,将检测到第一次点击。
更改message
会使视图重新绘制并更新屏幕上的消息。
struct ContentView: View {
@State private var lastTap: Date? = nil
@State private var message = ""
var body: some View {
VStack(spacing: 40) {
Text(message)
Button("Tap me") {
let now = Date()
if let last = self.lastTap {
if now.timeIntervalSince(last) > 5 {
self.message = "Greater than 5 seconds"
} else {
self.message = "Less than 5 seconds"
}
} else {
self.message = "First tap"
}
self.lastTap = now
}
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。