コードの抽象化を支援するために、SwiftUI のフォーム内にフォームを本質的に持つことが可能かどうかを理解したいと思います。以下に簡単な例を示します。これまでで最も単純なフォームがあったとします。
設定
struct TestForm: View {
@State var title: String = ""
@State var description: String = ""
var body: some View {
Form {
Section {
TextField("Name", text: $title)
TextField("Description", text: $description)
}
}
}
}
新しいフォームの追加
今、新しいサブフォームを追加したいのですが、そのロジックがメイン フォーム ビューを複雑にしたくありません。ここではSubForm
、新しいビューとそのすべての依存関係として追加したことを確認できます (状態変数は無視してください。これらは、swift が文句を言わないようにするためのものです。実際には、サブフォームは必要な任意の状態にリンクできます)
struct TestForm: View {
@State var title: String = ""
@State var description: String = ""
@State var option: Int = 0
func SubForm() -> some View {
VStack {
TextField("SubForm Name", text: $title)
Picker(selection: $option, label: Text("Question Type")) {
ForEach(Question.PayloadType.allCases, id: \.self) {
Text($0.rawValue)
}
}
}
}
var body: some View {
Form {
Section {
TextField("Name", text: $title)
TextField("Description", text: $description)
}
SubForm()
}
}
enum FormPicker: String, Codable, CaseIterable {
case firstOption = "First Option"
case secondOption = "Second Option"
}
}
しかし、フォームは次のようになります。
ご覧のとおり、サブフォームは基本的に 1 つのリスト アイテムにあります。これにより、実際にナビゲーション リンクのユーザビリティの問題が発生します。
これに関する明らかな問題は、フォームが本質的にリストであり、リストが平坦化されないこと、VStacks
または他Form
の sでさえないことです (サブビューがitForm
ではなくa にラップされていると想像してくださいVStack
)。
ただし、フォームが提供するスタイルを維持したいだけでなく、このロジックのグループ化も行いたいと考えています。ゴールドスタンダードは次のようになります。
単一の使用可能なフォームを維持しながら、この抽象化を達成する他の方法をお勧めできますか?
事前に乾杯