0

私が達成しようとしていること: 私は新しい SwiftUI 開発者です。シンプルなアドレス帳アプリを構築しようとしています。3 つのビューがあります。

  1. ContentView - リスト ビューにすべての連絡先を含むメイン ビューで、ナビゲーション ビューの上部に [連絡先の追加] ('+') と [編集] ボタンがあります。
  2. AddContact ビュー - 「名前」、「電子メール」テキスト フィールド、および「送信」ボタンがあります。
  3. DisplayContactDetails ビュー - この質問には関係ありません。

「Contact」オブジェクトの配列である環境オブジェクト「myContacts」を作成し、それを ContentView に渡して、アドレス帳のすべての連絡先を追跡しました。

ユーザーが AddContact ビューに移動し、名前と電子メールを追加して送信すると、環境オブジェクト "myContacts" が更新され、ユーザーが ContentView に戻って新しい連絡先のアドレス帳を表示できるようになります。含まれています。

問題:

ユーザーが AddContact ビューで [送信] を押すと、ユーザーを ContentView に戻すために作成したナビゲーション リンクが正しく呼び出されます。しかし、環境オブジェクト "myContacts" も送信によって更新されているため、すぐに ContentView から AddContact ビューに再び移動します。そのため、最初にナビゲーション リンクを実行しているように見えますが、myContacts の更新により AddContact ビューをリロードしています。

コード - コンテンツ ビュー:

    struct ContentView: View {
    
    @EnvironmentObject var myContacts: Contacts
    @State var isAddButtonPressed: Bool = false
    
    var body: some View {
        
        NavigationView{
           
            List {
                
                ForEach(myContacts.contacts) { item in
                    
                    NavigationLink(
                          //Display items and send user to DisplayContactDetails

                        })
                    
                }
            
            }
            .navigationBarTitle("Address Book")
            .toolbar {
                ToolbarItem(placement: .navigationBarLeading){
                    
                    Button(action: {
                        isAddButtonPressed.toggle()
                    }, label: {
                        
                       NavigationLink(
                        destination: AddContactView(),
                        isActive: $isAddButtonPressed,
                        label: {
                            Image(systemName: "plus")
                        })
                        
                    })
                }
                ToolbarItem(placement: .navigationBarTrailing){
                    EditButton()
                }
                
                
            }
        }
    }
    
}

コード - AddContactView

struct AddContactView: View {
    
    @State var name: String = ""
    @State var email: String = ""
    @State var isButtonPressed: Bool = false
    
    @EnvironmentObject var myContacts: Contacts
    
    var body: some View {
        
       
        VStack{
            
            HStack{
                Text("Name:")
                TextField("Enter name", text: $name)
            }
            .padding(.bottom, 50)
            
            HStack{
                Text("Email:")
                TextField("Enter email", text: $email)
            }
            .padding(.bottom, 50)
            
            
            Button("Submit") {
                
                let contactToAdd = Contact(name: name, email: email)
                
                //Add is a simple function - all it does is append an item to the    myContacts array using the .append method
                myContacts.add(contact: contactToAdd)
                isButtonPressed = true
            }

            .frame(width: 80, height: 30, alignment:.center)
            .background(Color.blue)
            .foregroundColor(.white)
            .clipShape(Capsule())
                
            NavigationLink(destination: ContentView().navigationBarHidden(true),
                    isActive: $isButtonPressed,
                    label: {
                       EmptyView()
                    }).hidden()
            
        }.padding()
            
        }
    
}

私が試したこと

.add メソッドをコメントアウトし、環境オブジェクトを更新しない場合、ContentView に戻るナビゲーションは期待どおりに機能します。だから私は、具体的には問題の原因であることを知っています.

ボタンに .onTapGesture 修飾子を追加して、そこに .add を呼び出してみました。

ビュー全体に .onDisappear 修飾子を追加して、そこに .add を呼び出してみました。

--これを解決するための助けや明確さは大歓迎です

編集:画面記録 - 最初のコメントに基づいて解決策を試す:

ソリューションを試すとどうなるか

奇妙な動作: 連絡先の自動ルートを追加しようとする最初の試みは、AddContactView に戻り、同じエラーが発生します。しかし、もう一度試してみると、ContactView に正しくルーティングされます。

4

1 に答える 1