SwiftUI contextMenu显示前一个值

问题描述 投票:0回答:1

我在SwiftUI ContextMenu上遇到了一个奇怪的问题,很可能是一个错误,但是也许其他人已经找到了解决方法。我将其简化为:

struct ContentView: View {
    @State var number = 20
    let timer = Timer.publish(every: 1, on: .main, in: .common).autoconnect()

    var body: some View {
        Text("\(number)")
            .padding()
            .background(Color.green)
            .contextMenu {
                Button(action: {}) {
                    Image(systemName: "star")
                    Text("Test")
                }
            }
            .onReceive(timer) { _ in
                if self.number > 0 {
                    self.number -= 1
                }
            }
    }
}

当contextMenu首次出现时,将显示正确的数字。但是,当第二次出现contextMenu时,它仍显示contextMenu的第一个值。

https://imgur.com/8sj4Agf

swift contextmenu swiftui
1个回答
0
投票

您可以使用以下技巧使计数持久化。

        @State var number : Int = 20
 @State var showNUmber : Bool = true
   let timer = Timer.publish(every: 1, on: .main, in: .common).autoconnect()

   var body: some View {
    Group{
    if self.showNUmber {
    Text("\(self.number)").padding()
                           .background(Color.green)
        .contextMenu{
               Button(action: {
               }) {
                   Image(systemName: "star")
                   Text("Test")
            }
        }.onLongPressGesture( pressing: { _ in
                        self.showNUmber = false
        }, perform: {
        })
    }else{

Text("\(self.number)").padding()
                                     .background(Color.green)
                  .contextMenu{
                         Button(action: {


                         }) {
                             Image(systemName: "star")
                             Text("Test")
                      }
                  }.onLongPressGesture( pressing: { _ in
                                  self.showNUmber = true
                  }, perform: {
                  })
        }
    }.onReceive(timer) { _ in
        if self.number > 0 {
            self.number -= 1
        }
    }

   }
© www.soinside.com 2019 - 2024. All rights reserved.