私が達成しようとしていること: 私は新しい SwiftUI 開発者です。シンプルなアドレス帳アプリを構築しようとしています。3 つのビューがあります。
- ContentView - リスト ビューにすべての連絡先を含むメイン ビューで、ナビゲーション ビューの上部に [連絡先の追加] ('+') と [編集] ボタンがあります。
- AddContact ビュー - 「名前」、「電子メール」テキスト フィールド、および「送信」ボタンがあります。
- 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 に正しくルーティングされます。