![](/img/trans.png)
[英]VStack shows error "Instance method 'sheet(item:onDismiss:content:)' requires that 'Int' conform to 'Identifiable'"
[英]Error: Instance method 'onReceive(_:perform:)' requires that 'Int' conform to 'Publisher'
我目前有一个Text()
,它根据 10 分钟计时器( 600 seconds
)更改,格式为 9: 9:59
: 9:58
等。
下面的代码正在工作,但是现在我遇到了一个问题。 我想在540 seconds
( 9:00
)执行一个动作,所以我添加了:
if self.countdown.secondsLeft <= 540 && !codeSent {
self.codeSent = true
}
然而,这给出了以下错误:
Modifying state during view update, this will cause undefined behavior.
所以相反,我想在我的onReceive(self.countdown.secondsLeft)
方法中添加剩余的秒数,如下所示 - 但 swift 不接受self.countdown.secondsLeft
因为它不是@Published
Int
:
Instance method 'onReceive(_:perform:)' requires that 'Int' conform to 'Publisher'
然而,确实如此。
我的代码如下:
主页查看.swift
struct HomeView: View {
@ObservedObject var waitingCountdown = CountDown(secondsLeft: 600)
var body: some View {
ZStack {
WaitingTimer(countdown: self.waitingCountdown)
}
}
WaitingTimer.swift
struct WaitingTimer: View {
@ObservedObject var countdown: CountDown
@State var codeSent = false
var body: some View {
VStack{
Text("\(timerText())")
.font(.system(size: 28))
.fontWeight(.bold)
.foregroundColor(Color("Exit"))
.frame(width: 80, height: 40)
.padding(EdgeInsets(top: 3, leading: 10, bottom: 3, trailing: 10))
.background(
Capsule()
.fill(Color.white)
.opacity(0.7)
)
.overlay(
Capsule()
.stroke(Color("Exit"), lineWidth: 2)
)
.onReceive(self.countdown.secondsLeft){
}
.onAppear{
print("Start countdown")
self.countdown.start()
}
.onDisappear {
self.countdown.stop()
}
}.frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity, alignment: .topLeading)
.padding(.top, 30)
.padding(.leading, 30)
}
func timerText() -> String{
print("seconds left: \(self.countdown.secondsLeft) | codeSent: \(codeSent)")
let minutes = Int( floor(Double(self.countdown.secondsLeft) / 60) )
let _seconds = (self.countdown.secondsLeft) - (minutes * 60)
if self.countdown.secondsLeft <= 540 && !codeSent {
print("SECONDS LEFT: \(self.countdown.secondsLeft) | CODESENT: \(codeSent)")
self.codeSent = true
}
// Show 9:09 instead of 9:9
let seconds = _seconds < 1 ? "0\(_seconds)" : String(_seconds)
print("Minutes \(minutes) Seconds left: \(seconds)")
return "\(minutes):\(seconds)"
}
}
倒计时.swift
class CountDown: ObservableObject {
init(secondsLeft: Int){
self.secondsLeft = secondsLeft
}
@Published var secondsLeft: Int
var timer: Timer?
func start(){
print("start timer: \(self.secondsLeft)")
self.timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true){ _ in
self.secondsLeft -= 1
}
}
func stop(){
self.timer?.invalidate()
} }
知道问题是什么吗?
@Zorgan 对于符合发布者错误的要求:
Instance method 'onReceive(_:perform:)' requires that 'Int' conform to 'Publisher'
在 onReceive 的 Published 属性上添加 $
onReceive(self.countdown.$secondsLeft)
然而,这给出了以下错误:
尝试以下操作(通常是对此类错误的修复)
if self.countdown.secondsLeft <= 540 && !codeSent {
DispatchQueue.main.async { // << update state async
self.codeSent = true
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.