まず、ビューの階層を強調表示することから始めたいと思います。私はただ持っFindUserView
ていWelcomeView
ます。
FindUserView
入力した電子メールが存在する場合、サーバーからユーザーを取得するために使用されます。もしそうなら、それWelcomeView
は私がパスワードを入力してログインできる次の場所に自動的にリダイレクトします。
ここにリポジトリとビデオSwiftUIを作成しました-ポップバックはビューの割り当てを解除しません
私のFindUserView
:----------------------------とWelcomeView
:
の[次へ]ボタンを押すとFindUserView
、データベースからユーザーを取得します。
func fetchUser(with email: String) {
userService.getUser(with: email) { (result) in
switch result {
case .success(_):
self.showActivityIndicator = false
self.showingAlert = false
self.showWelcomeView = true
break
case .failure:
self.showingAlert = true
break
}
}
}
私が使用NavigationView
してプログラム的に示してWelcomeView
変更することで、showWelcomeView
上記の状態を:
NavigationLink(destination: WelcomeView(), isActive: $showWelcomeView) { EmptyView() }
今、私は歓迎されていますWelcomeView
。
しかし、このボタンを押して元に戻すと、WelcomeView
まだ存在しています。
@EnvironmentObject
観察可能なプロパティの状態で使用すると、すでに却下されているビューにどのように反映されるかがわかります。これは正しい動作ですか?それとも、どういうWelcomeView
わけかデロックする必要がありますか?メモリリークにつながりますか?
UIKit
ナビゲーションスタックにポップバックすると、View ControllerUINavigationController
が配列から自動的に削除されて割り当てが解除されるので、少し心配です。SwiftUIで正しくポップバックする方法は?
実際、それが欠陥であるかどうかは明らかではありません-SwiftUIビューは値であるため、それらに割り当て解除することはありません。それはのように見えるNavigationView
だけのようなものに保つlastViewのそれは別のものに交換されるまで、変数を。たぶん、Appleにフィードバックを提出する価値があります。
一方NavigationLink
、これは、ビューがスタックから削除されたときに、正確にタップされてクリーンアップされるまで(ビューモデルなどの関連リソースを使用して)実際の宛先ビューの作成を延期できるソリューションです。
Xcode 11.4 / iOS13.4でテスト済み
ヘルパープロキシビュープレゼンター:
struct LinkPresenter<Content: View>: View {
let content: () -> Content
@State private var invlidated = false
init(@ViewBuilder _ content: @escaping () -> Content) {
self.content = content
}
var body: some View {
Group {
if self.invlidated {
EmptyView()
} else {
content()
}
}
.onDisappear { self.invlidated = true }
}
}
使用法:
NavigationLink(destination: LinkPresenter { WelcomeView() },
isActive: $showWelcomeView) { EmptyView() }
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加