繁体   English   中英

错误:实例方法 'onReceive(_:perform:)' 要求 'Int' 符合 'Publisher'

[英]Error: Instance method 'onReceive(_:perform:)' requires that 'Int' conform to 'Publisher'

我目前有一个Text() ,它根据 10 分钟计时器( 600 seconds )更改,格式为 9: 9:59 : 9:58等。

下面的代码正在工作,但是现在我遇到了一个问题。 我想在540 seconds9: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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM