SwiftUI - AppStorage 不适用于 GeometryReader

2023-11-30

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

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()
    }
}

我有3个要素:

  1. 黄色背景的文本 - 我需要它的全角,我使用 GeometryReader 来做到这一点。
  2. 文本。最后一个字应根据切换值切换开/关。这仅用于测试目的,以检查 AppStorage 是否正常工作。
  3. 切换 - 切换 onOff 变量并将其保存到 AppStorage (UserDefaults)。

AppStorage 仅在没有 GeometryReader 的情况下才能完美运行。请注释掉 3 个标记行来查看。

这是一个错误吗?或者我的 AppStorage 代码有问题?或者也许 GeometryReader 部分是错误的?如果我可以将黄色部分设置为全角,我就可以完全放弃 GeometryReader。


在我的测试中有效的一种解决方案是分解出GeometryReader的内容,包括@AppStorage:

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)
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SwiftUI - AppStorage 不适用于 GeometryReader 的相关文章

  • Swift 中的 quitFirstResponder

    我怎样才能用Apple的新语言实现它 Objective C 代码 void touchesBegan NSSet touches withEvent UIEvent event for UIView view in self view s
  • Android - API 请求

    我开发了一个应用程序 它也在 iPhone 上 问题出在 api 请求上 我为所有请求设置了超时 有时会出现 30 60 秒的中断 看起来这个应用程序执行了几个请求 然后就中断了 一直超时 大约 45 秒后一切正常 不知道是服务器问题还是安
  • 在 iOS 上使用 HEVC 编码器输出视频尺寸巨大

    我有一个项目 目前使用 H 264 编码器在 iOS 上录制视频 我想尝试在 iOS 11 中使用新的 HEVC 编码器来减小文件大小 但发现使用 HEVC 编码器会导致文件大小急剧膨胀 GitHub 上的一个项目显示了该问题 它使用 H
  • 当自定义子视图处理触摸时防止 UITableView 滚动

    在我的 iOS 应用程序中 有一个 UITableView 其中一个单元格中包含一个自定义子视图 该单元格是一个交互式视图 它处理触摸事件 touchesBegan touchesEnded touchesMoved 以更新自身 问题是 当
  • 删除具有estimatedItemSize 的项目时 UICollectionView 单元格大小会调整

    我有一个简单的项目 其中的故事板仅包含一个UICollectionViewController 使用 Xcode 7 1 1 为 iOS 9 1 构建 class ViewController UICollectionViewControl
  • 无法安装企业应用程序 - 此配置文件无法安装在此设备上

    我正在设置 Jenkins 来构建应用程序的企业版本 以便在我们的内部应用程序商店中分发 如果我将应用程序存档在 Xcode 中 然后在手机上下载内置的 ipa 则应用程序安装不会出现任何问题 但是当我使用 Jenkins 生成的具有相同私
  • 从 iOS 应用程序打开 YouTube 频道的最新 URL 方案是什么 [重复]

    这个问题在这里已经有答案了 我想使用 iPhone 应用程序中的频道打开 Youtube 应用程序 以前我使用以下 URL 方案并且工作正常 youtube 用户 频道名称 但在我将 Youtube 应用程序更新到最新的 2 6 0 后 这
  • 核心数据:为什么必须调用重新加载数据才能使我的应用程序运行?

    我花了整个晚上调试一个简单的应用程序 该应用程序从网络检索一张图像 是的 是的 旨在让我的生活更轻松 并将其显示在表格视图中 我这样做是为了练习学习核心数据 在我修复它之前 错误消息显示如下 2012 09 30 06 16 12 854
  • 无需 iPhone 6 Plus 即可预览 iOS 应用程序

    我已经在 Yosemite 中使用 iPhone 6 和 Quicktime 完成了 iOS 应用程序预览 视频 但我无法在 iTunes Connect 中为 iPhone 6 上传它 而且我没有 iPhone 6 设备 有没有办法在没有
  • 如何在 Swift Playgrounds 中获得弹出对话框

    我想知道如何在 Swift 中弹出一个对话框游乐场 是的 必须在 Playgrounds 中 我尝试了以下代码 直接来自 AppleDevs 站点 然而 无论我如何尝试 self tag always抛出错误 谁能帮我这个 import U
  • iOS 设置 MKMapView 中心,因此提供的位置位于底部中心

    我有一个 MKMapView 和一个永不改变的 CLLocationCooperative2D 我想做的是将地图居中 以便该坐标将放置在地图的底部中心 我可以用简单的方法将地图集中在这个坐标上 MKCoordinateRegion view
  • iOS NSURLSession,如何在didCompleteWithError中重试

    我想在我的服务器上尝试一次调用 直到成功为止 我想每 30 秒尝试一次 所以我使用 NSURLSession 进行通话 NSURLSessionDownloadTask task self session downloadTaskWithR
  • ios 11 - UIBarButtonItem 内的 UIButton 导致自动布局错误

    我在将 UIButton 添加到 UIBarButtonItem 时遇到了一个已知问题 我尝试按照建议添加自动布局约束堆栈溢出 https stackoverflow com a 46336639 505603但我收到如下所述的错误 UIB
  • UITextView:内存使用量巨大

    我在 UITextView 中遇到了内存使用过多的问题 我正在将 50Kb ascii 文本文件加载到 NSString 中 并将其分配给应用程序中空 UITextView 组件的 text 属性 这立即使我的内存占用量增加了 100Mb
  • 如何以编程方式使用资产目录图像的切片信息?

    我的项目中曾经有一个图像 我会像这样加载它 UIImage image UIImage imageNamed image name resizableImageWithCapInsets UIEdgeInsetsMake 10 0f 10
  • 如何从 Firebase 同步检索数据?

    我有两个集合 即用户和问题 根据使用 userId 登录的用户 我检索currQuestion价值来自users收藏 基于currQuestion值 我需要检索question来自 Firebase 的文档Questions收藏 我使用下面
  • Swift 中的 viewWillLayoutSubviews

    我正在尝试翻译SKScene scene GameScene sceneWithSize skView bounds size 进入 swift 但我收到错误 sceneWithSize 不可用 使用对象构造 SKScene size 我在
  • 使用 nib 作为带有 nib 类的表节标题

    我想创建一个加载 nib 文件并将其设置为标题 UIView 的节标题 这个 nib 文件还将有一个关联的类 其中插座和操作连接到 因此我想像平常一样使用 nib 加载该类 我在网上搜索并找到了几个类似的答案 但我找不到任何适合我的答案 经
  • 进入后台时 Alamofire 请求卡住?

    我正在使用 Alamofire 调用 Web 服务 该服务需要相当长的时间才能加载 如果应用程序进入后台 当我返回应用程序时 我会被加载程序卡住 我想这是因为调用永远不会向我的完成处理程序返回任何内容 我该如何解决这个问题 您可以使用后台抓
  • 选择 UITableViewCell 时 UIView 背景颜色消失

    我在界面生成器中构建了一个简单的 tableViewCell 它包含一个包含图像的 UIView 现在 当我选择单元格时 会显示默认的蓝色选择背景 但 UIView 的背景颜色消失了 我的 UITableViewCell 的实现文件没有做任

随机推荐

  • Android 模拟器复选框和单选按钮错误 - ui 上显示各种不正确的状态

    最近 我发现模拟器的显示单选按钮和复选框有奇怪的行为 它不是只有 2 种 UI 状态 更具体地说 它显示 4 种不同甚至更多 我想它们是冻结的动画状态 在布局检查器和新版本的 API 上 它看起来很正常 请看下面的图片 我在 Api 版本
  • python 中 time.sleep 的奇怪打印行为[重复]

    这个问题在这里已经有答案了 我试图通过在同一行上每秒打印一个点来创建一个类似进度的东西 比如 钓鱼 之类的 这是我用的 import time print Fishing end for i in range 5 time sleep 1
  • WPF 迭代数据网格

    使用 WPF C NET4 5 使用 Visual Studio 2012 ulti 旧的 winforms 代码 foreach DataGridViewRow paretoRow in ParetoGrid Rows if Conver
  • pygame 平台游戏 - 如何使底部坚固?

    所以我正在制作一个 pygame 平台游戏 但我被困在一件事上 我找不到一种方法来使我的平台底部变得坚固 玩家可以降落在其顶部 但当它试图穿过底部时 它会弹回下方 我尝试了这个但没有成功 hits pg sprite spritecolli
  • 通过C#反射获取类内Enum的类型

    我有一个像这样的枚举 namespace EnumTest public class Enumeration public Enumeration public enum Days day sunday night monday 我怎样才能
  • MongoDB oplog有键名带点的记录,无法查询,afaict

    鉴于 Mongo 允许使用 点 设置嵌套字段 例如 rs0 PRIMARY gt db tmp update a 1 set b c 2 upsert true rs0 PRIMARY gt db tmp findOne id Object
  • jQuery 自动完成@mention

    我有 Andrew Whitaker 的这个自动完成插件 DEMO假设我有一个字符串textarea 欢迎 peterwaterber 我希望它在隐藏标签中输出为 彼得沃特伯 欢迎 我该怎么办 我不太擅长Javascript 我尝试过查看这
  • 隐式移动与复制操作和遏制

    当类有一个未定义移动操作的成员时 我很难理解隐式移动操作 int main struct A no move move copy A default A const A cout lt lt A copy ctor n A operator
  • Pandas DF 上的 Cumsum,负累积值重置为零

    我在 Pandas DF 中有一个时间顺序分组表 我正在尝试在组内创建一个运行总和 条件是运行总和不能为负数 即当运行总和变为负数时 列单元格值重置为零 并继续运行总和计算以保持完整性和数据质量 我已将 cumsum 与 groupby 函
  • ubuntu:所有 Android 模拟器(x86 和 arm)都卡在“连接到套接字‘127.0.0.1:1970’时出错:111 -> 连接被拒绝”

    我已经尝试了所有的 Android 模拟器 但它们都停留在以下步骤 emulator Error while connecting to socket 127 0 0 1 1970 111 gt Connection refused emu
  • 合并多个数组的行数据

    我有两个数组 如下所示 我需要合并数组的内容 以便最终得到第三个数组所示的结构 我已经检查了 array merge 但无法弄清楚这是可能的方式 任何帮助表示赞赏 谢谢 gross value gt 100 quantity gt 1 gr
  • 大 VLA 溢出

    根据某人在另一个线程中的评论 VLA 带来的问题比它们解决的问题还要多 因为你永远不知道 如果声明会因为 x 太大而崩溃 堆 这段代码会溢出 因为sizeof a 对于堆栈来说太长 include
  • 如何在 Jmeter Webdriver 采样器中使用 chromeoption 和desirecapability?

    我正在使用带有 chrome 浏览器的 Jmeter webdriver 采样器 我需要在 jmeter 中使用 chromeoption 和desire 功能 如何编码以使用这些选项 我想使用的示例代码可以是这样的 ChromeOptio
  • jQuery 拖放 ul 和 li 元素

    一方面我得到了清单 ul and li The ul and li 元素应该被拖放 目标是一个div or span 我怎样才能开始呢 基本上你的draggables将是 li li 元素和你的 droppable 将是 div or sp
  • 在 SELECT 中选择行作为列[重复]

    这个问题在这里已经有答案了 可能的重复 如何选择列作为行 我有一张带有 ID 的桌子 例如 Table 1 2 3 4 5 and so on 我有这个疑问 选择A B 这里我需要选择 Id 作为列 来自我的表 所以结果将是 A B 1 2
  • x86 GNU 汇编器奇怪的变化段错误

    下面的 x86 汇编代码可以很好地编译 并且它曾经在我学校的 Linux 服务器上完美运行 但是当将相同的代码应用到我的 Linux 虚拟机 ubuntu 14 04 时 突然会导致分段错误 堆栈约定是否发生变化 这是 GNU 汇编器问题吗
  • 更改 TextView 中的文本字距或间距?

    我有一个要求 TextView 中的字母需要间隔远一些 不幸的是 我找到的大多数资源似乎都表明这是不可能做到的 至少不容易做到 到目前为止 明显的解决方案是 在字符串中的字符之间添加空格 改为 A B C 的 ABC 当然 如果空间再多一点
  • 在函数中找不到 PHP 全局变量 [重复]

    这个问题在这里已经有答案了 可能的重复 PHP 中的全局变量 我有一个类似的 PHP 脚本 global var1 function func1 var1 gt something var1 not found why 我必须在每个函数中执
  • 统计普罗米修斯发出的警报数

    我有 Prometheus 定义了一些警报规则 我想获得有关 Prometheus 发出的警报数量的统计数据 我试图计算用 grafana 触发警报的次数 但它不起作用 SUM ALERTS alertname XXX alertstate
  • SwiftUI - AppStorage 不适用于 GeometryReader

    这是一个简单的例子 您可以创建新的 SwiftUI iOS 项目并将其复制到 ContentView 文件 import SwiftUI struct Settings static let onOff onOff struct Conte