如何解决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 </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 举报,一经查实,本站将立刻删除。