0

コードの抽象化を支援するために、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)。

ただし、フォームが提供するスタイルを維持したいだけでなく、このロジックのグループ化も行いたいと考えています。ゴールドスタンダードは次のようになります。

フォームはどのように見えるべきか

単一の使用可能なフォームを維持しながら、この抽象化を達成する他の方法をお勧めできますか?

事前に乾杯

4

1 に答える 1