首页 > 解决方案 > 如何通知视图变量状态已从 SwiftUI 中提取的子视图中更新

问题描述

我有一个包含用户的视图,UsersContentView在这个视图中有一个按钮被提取为子视图:RequestSearchButton(),并且在按钮下有一个Text视图,如果用户请求搜索或没有,它会显示结果,它也被提取为一个子视图ResultSearchQuery()

struct UsersContentView: View {
    
    var body: some View {
        
        ZStack {
            VStack {
                RequestSearchButton()
                
                ResultSearchQuery(didUserRequestSearchOrNo: .constant("YES"))
            }
            
            
            
        }
        
    }
}


struct RequestSearchButton: View {
    var body: some View {
        Button(action: {
            
        }) {
            Text("User requested search")
        }
    }
}



struct ResultSearchQuery: View {
    @Binding var didUserRequestSearchOrNo: String
    var body: some View {
        Text("Did user request search: \(didUserRequestSearchOrNo)")
    }
}

如何在单击按钮时更新@Binding var didUserRequestSearchOrNo: String内部。它太混乱了!ResultSearchQuery()RequestSearchButton()

标签: iosswiftxcodeswiftui

解决方案


如果要提取变量,您需要在父视图或 ViewModel 中跟踪变量的状态(指示搜索是否处于活动状态)。然后,您可以在封闭的子视图(如搜索按钮或搜索查询结果)中引用此变量。

在这种情况下,a 更喜欢布尔值进行跟踪,因为它易于处理且含义清晰。

struct UsersContentView: View {
    
    @State var requestedSearch = false
    
    var body: some View {
        
        ZStack {
            VStack {
                RequestSearchButton(requestedSearch: $requestedSearch)
                
                ResultSearchQuery(requestedSearch: $requestedSearch)
            }
            
            
            
        }
        
    }
}

struct RequestSearchButton: View {
    @Binding var requestedSearch: Bool
    var body: some View {
        Button(action: {
            requestedSearch.toggle()
        }) {
            Text("User requested search")
        }
    }
}



struct ResultSearchQuery: View {
    @Binding var requestedSearch: Bool
    var body: some View {
        Text("Did user request search: \(requestedSearch.description)")
    }
}

推荐阅读