首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SwiftUI - AppStorage不适用于GeometryReader

SwiftUI - AppStorage不适用于GeometryReader
EN

Stack Overflow用户
提问于 2021-09-06 11:30:58
回答 2查看 269关注 0票数 2

下面是一个简单的例子。您可以创建新的SwiftUI iOS项目并将其复制到ContentView文件中。

代码语言:javascript
复制
import SwiftUI

struct Settings {
    static let onOff = "onOff"
}

struct ContentView: View {
    @AppStorage(wrappedValue: false, Settings.onOff) var onOff
    
    var body: some View {
        NavigationView {
            GeometryReader { reader in // < Comment out this line
                List {
                    Section (header:
                                VStack {
                                    HStack {
                                        Spacer()
                                        VStack {
                                            Text("THIS SHOULD BE FULL-WIDTH")
                                            Text("It is thanks to GeometryReader")
                                        }
                                        Spacer()
                                    }
                                    .padding()
                                    .background(Color.yellow)
                                    
                                    HStack {
                                        Text("This should update from AppStorage: ")
                                        Spacer()
                                        Text(onOff == true ? "ON" : "OFF")
                                    }
                                    .padding()
                                }
                                .frame(width: reader.size.width) // < Comment out this line
                                .textCase(nil)
                                .font(.body)
                    ) {
                        Toggle(isOn: $onOff) {
                            Text("ON / OFF")
                        }
                    }
                    
                }
                .listStyle(GroupedListStyle())
            } // < Comment out this line
            
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

我有三个要素:

  1. 黄色背景的文本-我需要它的全宽度,我使用GeometryReader来做它。
  2. 文本。最后一个词应该根据切换值打开/关闭。这只是为了测试,以检查AppStorage是否正确工作。
  3. 切换-切换onOff变量并将其保存到AppStorage (UserDefaults)。

AppStorage只有在没有GeometryReader的情况下才能完美地工作。请注释掉3行标签来检查它。

是虫子吗?或者我的AppStorage代码出了什么问题?或者GeometryReader部分是错的?如果我可以设置黄色部分的全宽度,我可以完全放弃GeometryReader .

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-09-06 16:31:05

在我的测试中起作用的一个解决方案是分解GeometryReader的内容,包括@AppStorage

代码语言:javascript
复制
struct ContentView: View {
    var body: some View {
        NavigationView {
            GeometryReader { proxy in
                _ContentView(width: proxy.size.width)
            }
        }
    }
}

struct _ContentView: View {
    var width: CGFloat
    @AppStorage(wrappedValue: false, Settings.onOff) var onOff

    var body: some View {
        List {
            Section(header: header) {
                Toggle(isOn: $onOff) {
                    Text("ON / OFF")
                }
            }

        }
        .listStyle(GroupedListStyle())
    }

    var header: some View {
        VStack {
            VStack {
                Text("THIS SHOULD BE FULL-WIDTH")
                Text("It is thanks to GeometryReader")
            }
            .padding()
            .frame(width: width)
            .background(Color.yellow)

            HStack {
                Text("This should update from AppStorage: ")
                Spacer()
                Text(onOff == true ? "ON" : "OFF")
            }
            .padding()
        }
        .textCase(nil)
        .font(.body)
    }
}
票数 2
EN

Stack Overflow用户

发布于 2021-09-06 12:05:39

是的,这绝对是个窃听器。看起来,由于某些原因,AppStorageState的行为不完全相同,而且更改不会触发GeometryReader内部的更新。示例可以简化为:

代码语言:javascript
复制
struct ContentView: View {
    @AppStorage("onOff") var onOff = false

    var body: some View {
        VStack {
            Text("Text updating: " + (onOff == true ? "ON" : "OFF"))
            GeometryReader { reader in
                Toggle(isOn: $onOff) {
                    Text("Text not updating: " + (onOff == true ? "ON" : "OFF"))
                }
            }
        }
    }
}

这在最新的iOS 15测试版中甚至没有得到修正。您可以尝试使用一些重复的状态变量进行黑客攻击,但是我建议您切换到自定义AppStorage,它在这种情况下工作得很好。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69073841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档