SwiftUI探索与发现:ModifiedContent 与 .modifier 创建的视图到底有什么区别?

2023-05-16

在这里插入图片描述

概览

为了更好的在 SwiftUI 中使用修改器,我们一般会将修改器包装到 View 的扩展方法中,比如下面的 KeyboardAdaptive 修改器:

struct KeyboardAdaptive: ViewModifier {
    @State private var keyboardHeight: CGFloat = 0

    func body(content: Content) -> some View {
        content
            .padding(.bottom, keyboardHeight)
            .onReceive(Publishers.keyboardHeight) { self.keyboardHeight = $0 }
    }
}

如果在视图上直接使用它,我们得这样写:

struct ContentView: View {
    @State private var text = ""

    var body: some View {
        VStack {
            Spacer()
            
            TextField("Enter something", text: $text)
                .textFieldStyle(RoundedBorderTextFieldStyle())
        }
        .padding()
        .modifier(KeyboardAdaptive())
    }
}

这略显冗长,若我们将它的调用放到 View 扩展中去,则可以大大简化代码,这在修改器包含若干默认参数时尤其有用:

extension View {
    func keyboardAdaptive() -> some View {
        ModifiedContent(content: self, modifier: KeyboardAdaptive())
    }
}

// 现在,我们可以这样调用 KeyboardAdaptive
VStack {
    Spacer()
    
    TextField("Enter something", text: $text)
        .textFieldStyle(RoundedBorderTextFieldStyle())
}
.padding()
.keyboardAdaptive()

可以注意到,除了在视图扩展中使用 ModifiedContent 应用修改器,我们还可以直接使用 .modifier 来调用修改器:

extension View {
    func keyboardAdaptive() -> some View {
        self.modifier(KeyboardAdaptive())
    }
}

那么,这两种方式生成的视图有什么区别呢?

且看分解!😎


探究

要想查看以上两者的区别,我们可以写一个简单的例子来测试一下:

struct TestModifier: ViewModifier {
    func body(content: Content) -> some View {
        content
            .padding(100)
    }
}

extension View {
    func test1() -> some View {
        ModifiedContent(content: self, modifier: TestModifier())
    }
    
    func test2() -> some View {
        self.modifier(TestModifier())
    }
}

在 Playground 中我们可以用 dump 方法查看以下三者的实际类型:

dump(Text("1").test1())
dump(Text("2").test2())
dump(Text("3").modifier(TestModifier()))

输出结果如下:

SwiftUI.ModifiedContent<SwiftUI.Text, __lldb_expr_45.TestModifier>
  ▿ content: SwiftUI.Text
    ▿ storage: SwiftUI.Text.Storage.anyTextStorage
      ▿ anyTextStorage: <LocalizedTextStorage: 0x00006000020c5b80>: "1" #0
        - super: SwiftUI.AnyTextStorage
        ▿ key: SwiftUI.LocalizedStringKey
          - key: "1"
          - hasFormatting: false
          - arguments: 0 elements
        - table: nil
        - bundle: nil
    - modifiers: 0 elements
  - modifier: __lldb_expr_45.TestModifierSwiftUI.ModifiedContent<SwiftUI.Text, __lldb_expr_45.TestModifier>
  ▿ content: SwiftUI.Text
    ▿ storage: SwiftUI.Text.Storage.anyTextStorage
      ▿ anyTextStorage: <LocalizedTextStorage: 0x00006000020c5400>: "2" #0
        - super: SwiftUI.AnyTextStorage
        ▿ key: SwiftUI.LocalizedStringKey
          - key: "2"
          - hasFormatting: false
          - arguments: 0 elements
        - table: nil
        - bundle: nil
    - modifiers: 0 elements
  - modifier: __lldb_expr_45.TestModifierSwiftUI.ModifiedContent<SwiftUI.Text, __lldb_expr_45.TestModifier>
  ▿ content: SwiftUI.Text
    ▿ storage: SwiftUI.Text.Storage.anyTextStorage
      ▿ anyTextStorage: <LocalizedTextStorage: 0x00006000020ceb20>: "3" #0
        - super: SwiftUI.AnyTextStorage
        ▿ key: SwiftUI.LocalizedStringKey
          - key: "3"
          - hasFormatting: false
          - arguments: 0 elements
        - table: nil
        - bundle: nil
    - modifiers: 0 elements
  - modifier: __lldb_expr_45.TestModifier

可以看到,以上三者完全一致!

至此,我们解决了开头的那个疑问。


总结

在 SwiftUI 的学习中,除了按部就班的学习书本上的内容以外,我们还要时常对某些现象提出质疑并学会如何验证结果。

感谢观赏,再会!😉

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

SwiftUI探索与发现:ModifiedContent 与 .modifier 创建的视图到底有什么区别? 的相关文章

  • 基于Java Web的传智播客crm企业管理系统的设计与实现

    项目描述 临近学期结束 xff0c 还是毕业设计 xff0c 你还在做java程序网络编程 xff0c 期末作业 xff0c 老师的作业要求觉得大了吗 不知道毕业设计该怎么办 网页功能的数量是否太多 没有合适的类型或系统 等等 这里根据疫情
  • 校园论坛网站设计设计与实现

    项目描述 临近学期结束 xff0c 还是毕业设计 xff0c 你还在做java程序网络编程 xff0c 期末作业 xff0c 老师的作业要求觉得大了吗 不知道毕业设计该怎么办 网页功能的数量是否太多 没有合适的类型或系统 等等 这里根据疫情
  • 基于springboot信用分析管理系统设计与实现。

    项目描述 临近学期结束 xff0c 还是毕业设计 xff0c 你还在做java程序网络编程 xff0c 期末作业 xff0c 老师的作业要求觉得大了吗 不知道毕业设计该怎么办 网页功能的数量是否太多 没有合适的类型或系统 等等 这里根据疫情
  • ubuntu 查询 修改 时间

    ubuntu 查询 修改 时间 date 用法 xff1a date 选项 43 格式 或 xff1a date u utc universal MMDDhhmm CC YY ss 以给定的格式显示当前时间 xff0c 或是设置系统日期 d
  • 基于ssm的小区物业管理系统

    项目描述 临近学期结束 xff0c 还是毕业设计 xff0c 你还在做java程序网络编程 xff0c 期末作业 xff0c 老师的作业要求觉得大了吗 不知道毕业设计该怎么办 网页功能的数量是否太多 没有合适的类型或系统 等等 这里根据疫情
  • 基于springboot的家装平台设计与实现

    项目描述 临近学期结束 xff0c 还是毕业设计 xff0c 你还在做java程序网络编程 xff0c 期末作业 xff0c 老师的作业要求觉得大了吗 不知道毕业设计该怎么办 网页功能的数量是否太多 没有合适的类型或系统 等等 这里根据疫情
  • 基于C#的公交充值管理系统的设计与实现

    项目描述 临近学期结束 xff0c 还是毕业设计 xff0c 你还在做C 程序网络编程 xff0c 期末作业 xff0c 老师的作业要求觉得大了吗 不知道毕业设计该怎么办 网页功能的数量是否太多 没有合适的类型或系统 等等 这里根据疫情当下
  • 基于ssm的宠物商城网站设计与实现

    项目描述 临近学期结束 xff0c 还是毕业设计 xff0c 你还在做java程序网络编程 xff0c 期末作业 xff0c 老师的作业要求觉得大了吗 不知道毕业设计该怎么办 网页功能的数量是否太多 没有合适的类型或系统 等等 这里根据疫情
  • 基于JSP网上书城的设计与实现

    项目描述 临近学期结束 xff0c 还是毕业设计 xff0c 你还在做java程序网络编程 xff0c 期末作业 xff0c 老师的作业要求觉得大了吗 不知道毕业设计该怎么办 网页功能的数量是否太多 没有合适的类型或系统 等等 这里根据疫情
  • 基于springboot的作业管理系统设计与实现

    项目描述 临近学期结束 xff0c 还是毕业设计 xff0c 你还在做java程序网络编程 xff0c 期末作业 xff0c 老师的作业要求觉得大了吗 不知道毕业设计该怎么办 网页功能的数量是否太多 没有合适的类型或系统 等等 这里根据疫情
  • 基于springboot的鲜花销售商城网站

    项目描述 临近学期结束 xff0c 还是毕业设计 xff0c 你还在做java程序网络编程 xff0c 期末作业 xff0c 老师的作业要求觉得大了吗 不知道毕业设计该怎么办 网页功能的数量是否太多 没有合适的类型或系统 等等 这里根据疫情
  • 基于ssm的社区疫情返乡管控系统设计实现

    项目描述 临近学期结束 xff0c 还是毕业设计 xff0c 你还在做java程序网络编程 xff0c 期末作业 xff0c 老师的作业要求觉得大了吗 不知道毕业设计该怎么办 网页功能的数量是否太多 没有合适的类型或系统 等等 这里根据疫情
  • 基于JavaWeb的大学迎新系统设计与实现(源码+数据库脚本+论文+开题报告)

    项目描述 临近学期结束 xff0c 还是毕业设计 xff0c 你还在做java程序网络编程 xff0c 期末作业 xff0c 老师的作业要求觉得大了吗 不知道毕业设计该怎么办 网页功能的数量是否太多 没有合适的类型或系统 等等 这里根据疫情
  • 基于SSM的网红书购物商城(源码+论文+开题报告+答辩PPT)

    项目描述 临近学期结束 xff0c 还是毕业设计 xff0c 你还在做java程序网络编程 xff0c 期末作业 xff0c 老师的作业要求觉得大了吗 不知道毕业设计该怎么办 网页功能的数量是否太多 没有合适的类型或系统 等等 这里根据疫情
  • 一、Scala编程语言基础

    一 scala基础 xff1a 前语 xff1a 本文章是作者在学习Scala语言时记录的 xff0c 是在linux系统中 xff0c 通过终端shell命令使用Scala语言进行练习 xff0c 参考了厦门大学数据库实验中的内容 如果有
  • 基于SSM网上商城购物系统的设计与实现

    项目描述 临近学期结束 xff0c 还是毕业设计 xff0c 你还在做java程序网络编程 xff0c 期末作业 xff0c 老师的作业要求觉得大了吗 不知道毕业设计该怎么办 网页功能的数量是否太多 没有合适的类型或系统 等等 这里根据疫情
  • 基于SSM的学生考勤管理系统的设计与实现

    项目描述 临近学期结束 xff0c 还是毕业设计 xff0c 你还在做java程序网络编程 xff0c 期末作业 xff0c 老师的作业要求觉得大了吗 不知道毕业设计该怎么办 网页功能的数量是否太多 没有合适的类型或系统 等等 这里根据疫情
  • 基于JavaWeb的宿舍管理系统的设计与实现

    项目描述 临近学期结束 xff0c 还是毕业设计 xff0c 你还在做java程序网络编程 xff0c 期末作业 xff0c 老师的作业要求觉得大了吗 不知道毕业设计该怎么办 网页功能的数量是否太多 没有合适的类型或系统 等等 这里根据疫情
  • 今天给大家介绍一篇基于SSM的教材管理系統的设计与实现

    项目描述 临近学期结束 xff0c 还是毕业设计 xff0c 你还在做java程序网络编程 xff0c 期末作业 xff0c 老师的作业要求觉得大了吗 不知道毕业设计该怎么办 网页功能的数量是否太多 没有合适的类型或系统 等等 这里根据疫情
  • 教材征订和下发系统

    项目描述 临近学期结束 xff0c 还是毕业设计 xff0c 你还在做java程序网络编程 xff0c 期末作业 xff0c 老师的作业要求觉得大了吗 不知道毕业设计该怎么办 网页功能的数量是否太多 没有合适的类型或系统 等等 这里根据疫情

随机推荐