在swiftUI中关闭操作表时是否会重新创建视图?

2j4z5cfb  于 2023-10-15  发布在  Swift
关注(0)|答案(2)|浏览(104)

我有以下代码:

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。那么,当我关闭操作表或另一个进程在内部运行时,我的视图是否会重新创建?
我试图阅读苹果的文档,但没有发现任何关于它的信息。

pjngdqdw

pjngdqdw1#

视图不必重新渲染。这是因为绑定机制,在这个场景中是showLogoutOptions@State。你可以在这里看到.actionSheet(isPresented: $showLogoutOptions)。这意味着当actionSheet被呈现/解除时,它将绑定到showLogoutOptions。您可以尝试在使用$showLogoutOptions时删除一些调试点。每次它改变时,它都会调用这些代码行。

rekjcdws

rekjcdws2#

在swiftUI中关闭操作表时是否会重新创建视图?
首先,我假设“关闭操作表”意味着在操作表上选择“取消”。我不知道loginViewModel.handleSignOut是做什么的,所以不能真正推理。
然后,我们需要弄清楚“视图”被“重新创建”意味着什么。
你是说ProfileView.init叫什么?我们不能确定不能保证SwiftUI会调用你的init,也不能保证它不会。
你是说ProfileView.body又被访问了?如果您还将$showLogoutOptions(在取消操作表后发生了更改)传递给LogoutButtonProfileView.body可能会再次被评估,以查看LogoutButton中是否有任何内容需要更新(在这种情况下,没有)。
或者你的意思是按钮和导航栏 * 在屏幕上 * 更改为不同的按钮和导航栏?他们可能没有改变。SwiftUI比较了ProfileView.body上次返回的内容和这次返回的内容,发现除了动作表被取消之外,几乎没有什么变化,所以它不会创建新的按钮或新的导航栏。

相关问题