热门标签 | HotTags
当前位置:  开发笔记 > IOS > 正文

在@ViewBuilder闭包中更改@State

如何解决《在@ViewBuilder闭包中更改@State》经验,为你挑选了1个好方法。

我试图了解如何更改闭包中的@State变量@ViewBuilder。以下只是一个简单的示例:

struct ContentView: View {
    @State var width = CGFloat(0)

    var body: some View { //Error 1
        GeometryReader { geometry in //Error 2
            self.width = geometry.size.width
            return Text("Hello world!")
        }
    }
}

我遇到一些错误:

错误1:

函数声明了一个不透明的返回类型,但是在其主体中没有用于从其推断基础类型的返回语句

但这return是多余的,因为在View计算属性内只有一行代码。

错误2:

无法将类型'GeometryReader <_>'的返回表达式转换为返回类型'some View'

既然我明确地写return Text("...")了,那类型就不应该清楚吗?

这是什么问题



1> Procrastin8..:

首先,您不能在中做出任意的swift语句functionBuilder。允许使用特定的语法。在SwiftUI的情况下,它是一个ViewBuilder,它在幕后构成您的类型。当您在SwiftUI中创建连续的语句时,实际上是在依赖编译器根据该DSL的规则在其下编写新类型。

第二,SwiftUI是一个配方,不是事件系统。您无需body函数中更改状态变量,而是可以设置状态变量在外部更改时应如何反应。如果希望另一个视图对该宽度做出某种反应,则需要根据所需组件的宽度定义该内容。不知道您的最终目标是什么,很难回答如何将内容相互关联。

编辑:

我被要求详细说明允许的内容。每个functionBuilder都有其functionBuilder自身定义的不同允许语法。这对Swift 5.1中的函数构建器有很好的概述:https : //www.swiftbysundell.com/posts/the-swift-51-features-that-power-swiftuis-api

至于SwiftUI专门寻找的东西,它实际上是在寻找每个语句以返回的实例View

// works fine!
VStack {
  Text("Does this")
  Text("Work?")
}

// doesn't work!
VStack {
  Text("Updating work status...")
  self.workStatus = .ok // this doesn't return an instance of `View`!
}

// roundabout, but ok...
VStack {
  Text("Being clever")
  gimmeView()
}

// fine to execute arbitrary code now, as long as we return a `View`
private func gimmeView() -> some View {
    self.workingStatus = .roundabout 
    return Text("Yes, but it does work.")
}

这就是为什么出现钝性错误的原因:

无法将类型'GeometryReader <_>'的返回表达式转换为返回类型'some View'

该类型的系统不能建立任何View出来的View,基本上Void当你执行:

self.width = geometry.size.width

当您View在下面执行连续语句时,它仍将被转换为一种新的类型View

// the result of this is TupleView
Text("left")
Text("right")


推荐阅读
  • SDWebImage第三方库学习
    1、基本使用方法异步下载并缓存-(void)sd_setImageWithURL:(nullableNSURL*)urlNS_REFINED_FOR_SWIFT;使用占位图片& ... [详细]
  • 本文旨在探讨Swift中的Closure与Objective-C中的Block之间的区别与联系,通过定义、使用方式以及外部变量捕获等方面的比较,帮助开发者更好地理解这两种机制的特点及应用场景。 ... [详细]
  • 本文针对HDU 1042 N! 问题提供详细的解析和代码实现。题目要求计算给定整数N(0 ≤ N ≤ 10000)的阶乘N!。文章不仅提供了算法思路,还附上了C++语言的具体实现。 ... [详细]
  • 吴石访谈:腾讯安全科恩实验室如何引领物联网安全研究
    腾讯安全科恩实验室曾两次成功破解特斯拉自动驾驶系统,并远程控制汽车,展示了其在汽车安全领域的强大实力。近日,该实验室负责人吴石接受了InfoQ的专访,详细介绍了团队未来的重点方向——物联网安全。 ... [详细]
  • 本文详细介绍了如何在最新版本的Xcode中重命名iOS项目,包括项目名称、应用名称及相关的文件夹和配置文件。通过本文,开发者可以轻松完成项目的重命名工作。 ... [详细]
  • Fiddler 安装与配置指南
    本文详细介绍了Fiddler的安装步骤及配置方法,旨在帮助用户顺利抓取用户Token。文章还涵盖了一些常见问题的解决方案,以确保安装过程顺利。 ... [详细]
  • hlg_oj_1116_选美大赛这题是最长子序列,然后再求出路径就可以了。开始写的比较乱,用数组什么的,后来用了指针就好办了。现在把代码贴 ... [详细]
  • 在尝试加载支持推送通知的iOS应用程序的Ad Hoc构建时,遇到了‘no valid aps-environment entitlement found for application’的错误提示。本文将探讨此错误的原因及多种可能的解决方案。 ... [详细]
  • 2023年,Android开发前景如何?25岁还能转行吗?
    近期,关于Android开发行业的讨论在多个平台上热度不减,许多人担忧其未来发展。本文将探讨当前Android开发市场的现状、薪资水平及职业选择建议。 ... [详细]
  • 管理UINavigationController中的手势返回 - Managing Swipe Back Gestures in UINavigationController
    本文介绍了如何在一个简单的闪存卡片应用中实现平滑的手势返回功能,以增强用户体验。 ... [详细]
  • 开发技巧:在Interface Builder中实现UIButton文本居中对齐的方法与步骤
    开发技巧:在Interface Builder中实现UIButton文本居中对齐的方法与步骤 ... [详细]
  • 第六章:枚举类型与switch结构的应用分析
    第六章深入探讨了枚举类型与 `switch` 结构在编程中的应用。枚举类型(`enum`)是一种将一组相关常量组织在一起的数据类型,广泛存在于多种编程语言中。例如,在 Cocoa 框架中,处理文本对齐时常用 `NSTextAlignment` 枚举来表示不同的对齐方式。通过结合 `switch` 结构,可以更清晰、高效地实现基于枚举值的逻辑分支,提高代码的可读性和维护性。 ... [详细]
  • 解决UIBarButtonItem 边缘显示异常的问题分析与优化方案
    在iOS开发中,针对UIBarButtonItem边缘显示异常的问题进行了深入分析,并提出了一系列优化方案。通过自定义视图和调整布局约束,有效解决了按钮在不同设备和屏幕尺寸下的显示问题,提升了用户体验。具体方法包括使用AutoLayout进行动态调整,以及对按钮的内边距和外边距进行精细控制,确保按钮在各种场景下都能保持良好的视觉效果。 ... [详细]
  • 当前,众多初创企业对全栈工程师的需求日益增长,但市场中却存在大量所谓的“伪全栈工程师”,尤其是那些仅掌握了Node.js技能的前端开发人员。本文旨在深入探讨全栈工程师在现代技术生态中的真实角色与价值,澄清对这一角色的误解,并强调真正的全栈工程师应具备全面的技术栈和综合解决问题的能力。 ... [详细]
  • 本文详细分析了 LeetCode 1019 题目“链表中每个节点的下一个更大值”,探讨了如何在链表中找到每个节点右侧第一个比其值更大的节点。通过使用栈的数据结构,我们可以高效地解决这一问题,并提供了详细的代码实现和复杂度分析。 ... [详细]
author-avatar
手机用户2502897401
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有