0

我对 Swift 和 iOS 应用程序真的很陌生,无法弄清楚以下内容。

我正在尝试创建一个简单的 5 步评级元素,将值存储到用户默认值。但它不能“即时”工作,这意味着用户无法立即看到更改,只能在重新启动应用程序时看到。通过不同的不透明度表示的评级。

所以,问题是: 点击时不会立即显示更改,而是在重新启动应用程序后才会显示更改。

我阅读了有关@AppStorage 的文章,但无法弄清楚。

struct EverythingView: View {
   @AppStorage("customRating") var customTemp: Int = 1

   HStack (spacing: 6) {
      ForEach(1...5, id: \.self) { index in
         Circle()
            .fill(Color(.green))
            .frame(width: 15, height: 15)
            .onTapGesture {
               customRating = index
               print(customRating) // prints the correct value on the fly
             }
             .opacity(index > customRating ? 0.5 : 1) // does not update the opacity of the circles on the fly, only on relaunching the app
      }
   }
}

我是否必须在循环内的某个地方再次访问@AppStorage?据我了解,它会自动更新和传播吗?

感谢您的任何提示!

编辑: 使用 an@State而不是@AppStorage var按预期工作。

4

1 回答 1

1

你做得对,你只是在第一行有一个错字。您的 @AppStorage 属性也需要命名为 customRating

struct EverythingView: View {
   @AppStorage("customRating") var customRating: Int = 1 //<---property name should be customRating

    var body: some View {
        Color.clear
        HStack (spacing: 6) {
            ForEach(1...5, id: \.self) { index in
             Circle()
                .fill(Color(.green))
                .frame(width: 15, height: 15)
                .onTapGesture {
                   customRating = index
                   print(customRating) // prints the correct value on the fly
                 }
                 .opacity(index > customRating ? 0.5 : 1) // does not update the opacity of the circles on the fly, only on relaunching the app
            }
        }
    }
}
于 2022-01-02T14:07:06.360 回答