微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SwiftUI:结构视图vs @ViewBuilder

如何解决SwiftUI:结构视图vs @ViewBuilder

如果我想在SwiftUI中呈现项目列表,则可以执行以下操作(使用XCode 12):

struct MyView: View {
    let texts: [String]
    var body: some View {
        ScrollView {
            Lazyvstack {
                ForEach(texts.indices,id: \.self) { index in
                    MyRow(label: texts[index])
                }
            }
        }
    }

    struct MyRow: View {
        let label: String
        var body: some View {
            Text(label).font(.title3).padding()
        }
    }
}

MyRow可以不是一个结构,而可以是一个函数,从而使代码更加简洁和实用:

struct MyView: View {
    let texts: [String]
    var body: some View {
        ScrollView {
            Lazyvstack {
                ForEach(texts.indices,id: \.self) { index in
                    MyRow(label: texts[index])
                }
            }
        }
    }

    @viewbuilder func MyRow(label: String) -> some View {
        Text(label).font(.title3).padding()
    }
}

我想了解两种方法间的区别。 在某些情况下,您会优先选择一个吗?

首先想到的是,您无法拥有具有函数@State属性,这意味着如果视图需要状态,则需要使用struct方法

就这些吗?在某些情况下,是否有一种方法在优化方面更好?调试?特征?可移植性?

解决方法

<div class="" style="flex-wrap: wrap; display: flex;"> {{ formset.management_form }} {% for form in formset %} {% csrf_token %} <div class="col "> <table style="border-radius: 21px;"> <p style="font-weight: 500;" class="question-text"> </p> <tr class="bubbles"> <td class="bubble-text-left">Not interested&nbsp;</td> {% for choice in form.value %} <td> <label class="container"> <input type="radio" name="{{ form.value.choice.name }}" value="{{ form.value.choice.0 }}" id='{{ form.value.choice.auto_id }}' class="{{ radio_input.choice_value }}"> <span class="checkmark"></span> </label> </td> {% endfor %} <td class="bubble-text-right">Very interested</td> </tr> </table> <br> </div> {{ form.id }} {{ form.question }} {% endfor %} </div> 通常用于有条件地渲染视图,而无需使用@ViewBuilder这样的解析器。引用Apple Developer's website:“此函数的客户端可以使用多语句闭包来提供多个子视图”。例如,如果您要显示取决于变量的视图,即,如果某个变量为true,则渲染View1,如果其为false,则渲染View2。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。