用于自定义视图的 SwiftUI ViewModifier

2024-02-16

有没有办法创建一个修改器来更新@State private var在正在修改的视图中?

我有一个自定义视图,它返回Text具有“动态”背景颜色或Circle具有“动态”前景色。

struct ChildView: View {
    var theText = ""
    
    @State private var color = Color(.purple)
    
    var body: some View {
        HStack {
            if theText.isEmpty {          // If there's no theText, a Circle is created
                Circle()
                    .foregroundColor(color)
                    .frame(width: 100, height: 100)
            } else {                      // If theText is provided, a Text is created
                Text(theText)
                    .padding()
                    .background(RoundedRectangle(cornerRadius: 25.0)
                                    .foregroundColor(color))
                    .foregroundColor(.white)
            }
        }
    }
}

我在应用程序的不同部分重复使用此视图。如您所见,我需要指定的唯一参数是theText。那么,创建这个ChildView的可能方式如下:

struct SomeParentView: View {
    var body: some View {
        VStack(spacing: 20) {
            ChildView()   // <- Will create a circle

            ChildView(theText: "Hello world!")   // <- Will create a text with background
        }
    }
}

到目前为止没有什么特别的。现在,我需要的是创建(也许)一个修改器等,以便在父视图中我可以更改该值@State private var color from .red如果我需要对该 ChildView 进行更多自定义,则可以更改为其他颜色。我想要实现的目标的示例:

struct SomeOtherParentView: View {
    var body: some View {
        HStack(spacing: 20) {
            ChildView()

            ChildView(theText: "Hello world!")
                .someModifierOrTheLike(color: Color.green)   // <- what I think I need
        }
    }
}

我知道我可以删除private关键字来自那个var并通过color作为构造函数中的参数(例如:ChildView(theText: "Hello World", color: .green)),但我不认为这是解决这个问题的方法,因为如果我需要对子视图进行更多自定义,我最终会得到一个非常大的构造函数。

那么,关于如何实现我想要的目标有什么想法吗?希望我能解释一下自己:) 谢谢!!!


这是你的视图,修饰符只是生成另一个修改后的视图的函数,所以......这里有一些可能的简单方法来实现你想要的。

使用 Xcode 12 / iOS 14 进行测试

struct ChildView: View {
    var theText = ""
    
    @State private var color = Color(.purple)
    
    var body: some View {
        HStack {
            if theText.isEmpty {          // If there's no theText, a Circle is created
                Circle()
                    .foregroundColor(color)
                    .frame(width: 100, height: 100)
            } else {                      // If theText is provided, a Text is created
                Text(theText)
                    .padding()
                    .background(RoundedRectangle(cornerRadius: 25.0)
                                    .foregroundColor(color))
                    .foregroundColor(.white)
            }
        }
    }
    
    // simply modify self, as self is just a value
    public func someModifierOrTheLike(color: Color) -> some View {
        var view = self
        view._color = State(initialValue: color)
        return view.id(UUID())
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用于自定义视图的 SwiftUI ViewModifier 的相关文章

随机推荐

  • 具有动态字段的 Angular Reactive Form

    我目前正在与 Angular 形式数组作斗争 我有一个动态添加字段的表单 我已经创建了表单对象 this otherDataForm this fb group 我添加了这样的动态字段 addField field CustomFormFi
  • 在C#中通过串口发送ctrl+C?

    How can I send my device ctrl c through serial port in C 串行端口不传输密钥 它们传输字节 通常是 字符的 ASCII 表示形式 Keys ControlKey Keys C 与感知
  • 在 Mongoid 中使用 AND 和 OR 的组合

    我想构造一个以下形式的查询 select from some table where field1 x or field2 y and field3 z or field4 w 通过阅读文档 我认为它应该看起来像这样Mongoid Some
  • Delphi:如何响应WM_SettingChange/WM_WinIniChange?

    我需要知道我的申请何时收到WM SETTINGCHANGE http msdn microsoft com en us library ms725497 v VS 85 aspx消息 以前称为WM WININICHANGE http msd
  • 怎么躲得过感叹号啊!在cmd脚本中?

    当我有setlocal ENABLEDELAYEDEXPANSION在cmd脚本中设置有什么方法可以逃脱 我想用作命令的参数 echo off setlocal ENABLEDELAYEDEXPANSION echo I want to g
  • R studio 4.0 上的 easi 包

    easi 包 精确仿射石索引模型 有点旧 但对我的目的仍然有用 考虑到它是基于 R 2 15 3 构建的 有人设法将它安装在 Rstudio 4 上吗 谢谢 我分叉了 github 存储库并更新了源代码以修复Error in class f
  • Excel VBA 自动筛选添加空行

    我修改了 Excel 宏 之前它是逐行进行的 现在它会批量过滤结果和复制 效率更高 我现在遇到的问题是 自动过滤器向工作表中添加了数百万个空行 但我无法确定为什么会这样做 CountryCodes 是一个字典 其中包含过滤器的值 Crite
  • iOS 多个 AVPlayer 对象导致音频/视频同步丢失

    我一直在尝试使用两种不同的AVQueuePlayer我的应用程序中的对象 第一个播放器播放一系列通过网络传输的短视频剪辑 第二个对象仅播放一个视频 但长度要长得多 它也是流式传输的 我已验证所有剪辑都具有正确的音频 视频同步 我注意到的是
  • 从缓存的选择器遍历 DOM 是否比在 DOM 中查找 ID 元素更快?

    关于通过 class 或 id 或其他选择器查找元素是否更快存在很多问题 我对此不感兴趣 我想知道你是否有 var link this let s say you re in a click handler 通过这样做找到容器是否更快 va
  • 等待元素中的文本发生更改

    请建议 Selenium 是否有一个好的选项可以等待元素内的文本发生更改 状况 页面不会自动重新加载 我需要的文本元素会动态重新加载 该数据更新所需时间未知 预期文本未知 它是一个时间戳 我编写了一个方法 每 1 秒 或我设置的任何时间 检
  • 当 localStorage 已满时会发生什么?

    我已经发现articles http code google com speed page speed docs caching html关于缓存行为 所以我只能假设它没有太大不同 但我想确定一下 我读到大多数浏览器都有 5MB 给予或接受
  • 我应该如何正确实现 Clojure 核心接口?

    如果我使用 Clojure 实现一些数据结构deftype 我应该如何决定哪一个Clojure 核心接口 https github com clojure clojure tree master src jvm clojure lang实施
  • 在 Android 上使用 LuaJ 从 Lua 脚本中请求其他 lua 脚本

    我在 Android 上通过 LuaJ 从 Java 调用需要其他 Lua 脚本的 Lua 脚本时遇到问题 我认为这与我当前的工作目录有关 我在 Java 中尝试的 InputStream input EvilApp getContext
  • Spring通过构造函数参数表达不满足的依赖关系,索引类型为0

    完整的消息是 Caused by org springframework beans factory UnsatisfiedDependencyException Error creating bean with name userRepo
  • Javascript 中日期范围内有多少个特定天

    我有两个约会 一个是开始日期 另一个是结束日期 我想计算有多少个星期六 星期一和星期三属于该日期范围 我该如何解决 我看过几个教程 但他们只计算日期范围内的日期 提前致谢 我使用以下代码仅计算工作日 但我只需要有多少个星期六 星期一和星期三
  • JBuilder 模板永远不会被调用

    在我的 Rails 4 应用程序中 我有一个API V1 ClustersController结构如下 class Api V1 ClustersController lt ApplicationController respond to
  • SELECT 语句的 SQL 别名

    我想做类似的事情 SELECT FROM AS my select WHERE id IN SELECT MAX id FROM my select GROUP BY name 是否可以以某种方式执行 AS my select 部分 即为
  • 核心 API 控制器捕获所有未知路线

    我有一个 Core 2 2 API 和一堆现有的控制器 我现在想做的是添加一个新的控制器 其行为类似于包罗万象的路线 但仅适用于该控制器 并且不干扰现有控制器的路线 在我现有的控制器中 我将路由定义为控制器属性 Route api cont
  • 使用 iText 签名时,Adobe Reader 报告“签名是使用“不可用”创建的。”

    我正在使用 iText 成功签署文档 但是 每当我在 Adob e Reader 中检查 高级签名属性 时 我都会看到 签名是使用 不可用 创建的 我的问题是 如何使用 iText 更新此信息 然后在 Adob e Reader 或任何其他
  • 用于自定义视图的 SwiftUI ViewModifier

    有没有办法创建一个修改器来更新 State private var在正在修改的视图中 我有一个自定义视图 它返回Text具有 动态 背景颜色或Circle具有 动态 前景色 struct ChildView View var theText