我有以下代码:
struct ProfileView: View {
@ObservedObject var loginViewModel: LoginViewModel
@State private var showLogoutOptions = false
var body: some View {
NavigationView {
VStack {
}
.toolbar {
ToolbarItem(placement: .topBarLeading) {
LogoutButton(showLogoutOptions: $showLogoutOptions)
}
}
.actionSheet(isPresented: $showLogoutOptions) {
ActionSheet(
title: Text("Settings"),
message: Text("What you want to do?"),
buttons: [
.destructive(
Text("Sign Out"),
action: loginViewModel.handleSignOut
), .cancel()
]
)
}
} }
}
struct LogoutButton: View {
@Binding var showLogoutOptions: Bool
var body: some View {
Button {
showLogoutOptions = true
} label: {
Image(systemName: "gear")
.font(.system(size: 24))
.bold()
.foregroundStyle(.black)
}
}
}
当我关闭操作表时,showLogoutOptions再次为false。那么,当我关闭操作表或另一个进程在内部运行时,我的视图是否会重新创建?
我试图阅读苹果的文档,但没有发现任何关于它的信息。
2条答案
按热度按时间pjngdqdw1#
视图不必重新渲染。这是因为绑定机制,在这个场景中是
showLogoutOptions
@State。你可以在这里看到.actionSheet(isPresented: $showLogoutOptions)
。这意味着当actionSheet被呈现/解除时,它将绑定到showLogoutOptions
。您可以尝试在使用$showLogoutOptions
时删除一些调试点。每次它改变时,它都会调用这些代码行。rekjcdws2#
在swiftUI中关闭操作表时是否会重新创建视图?
首先,我假设“关闭操作表”意味着在操作表上选择“取消”。我不知道
loginViewModel.handleSignOut
是做什么的,所以不能真正推理。然后,我们需要弄清楚“视图”被“重新创建”意味着什么。
你是说
ProfileView.init
叫什么?我们不能确定不能保证SwiftUI会调用你的init
,也不能保证它不会。你是说
ProfileView.body
又被访问了?如果您还将$showLogoutOptions
(在取消操作表后发生了更改)传递给LogoutButton
,ProfileView.body
可能会再次被评估,以查看LogoutButton
中是否有任何内容需要更新(在这种情况下,没有)。或者你的意思是按钮和导航栏 * 在屏幕上 * 更改为不同的按钮和导航栏?他们可能没有改变。SwiftUI比较了
ProfileView.body
上次返回的内容和这次返回的内容,发现除了动作表被取消之外,几乎没有什么变化,所以它不会创建新的按钮或新的导航栏。