如何在 SwiftUI 中从减去的子视图中关闭视图
Posted
技术标签:
【中文标题】如何在 SwiftUI 中从减去的子视图中关闭视图【英文标题】:How it is possible to dismiss a view from a subtracted subview in SwiftUI 【发布时间】:2020-12-11 16:56:06 【问题描述】:每当我的代码变得太大时,SwiftUI 就会开始表现得很奇怪并产生错误:
"The compiler is unable to type-check this expression in reasonable time; try breaking up the expression into distinct sub-expressions"
所以我开始将我的代码分解为Extracted Subviews
,我遇到的问题之一是如何从减去的子视图中消除视图。
例子:我们这里有LoginContentView
这个视图包含一个按钮,当点击按钮时它会显示下一个视图UsersOnlineView
。
struct LoginContentView: View
@State var showUsersOnlineView = false
var body: some View
Button(action:
self.showUsersOnlineView = true
)
Text("Show the next view")
.fullScreenCover(isPresented: $showUsersOnlineView, content:
UsersOnlineView()
)
另一方面,我们有一个提取到子视图的按钮,用于关闭模式并返回原始视图:
import SwiftUI
struct UsersOnlineView: View
var body: some View
ZStack
VStack
CloseViewButton()
struct CloseViewButton: View
var body: some View
Button(action:
// Close the Modal
)
Text("Close the view")
【问题讨论】:
【参考方案1】:给 sbview 定义视图是否显示的 state 属性。
struct CloseViewButton: View
@Binding var showView: Bool
var body: some View
Button(
ShowView = false
)
Text("Close the view")
当你使用子视图时,给它属性
CloseButtonView(showView: $showOnlineView)
要允许子视图更改 isShown 属性,它需要获得一个绑定。
关于演示模式。我认为这仅适用于 Swiftui 演示文稿,例如 sheet 和 alert。
【讨论】:
【参考方案2】:此场景最简单的解决方案是使用presentationMode
环境变量:
struct CloseViewButton: View
@Environment(\.presentationMode) var presentationMode
var body: some View
Button(action:
presentationMode.wrappedValue.dismiss()
)
Text("Close the view")
使用 Xcode 12.1 / ios 14.1 测试
【讨论】:
我在我的项目上试过了,它对我不起作用,我的项目当你单击关闭按钮时,它会显示一个弹出窗口,是/否,当我将代码环境设置为是时它没有关闭模态,那么还有其他解决方案吗?以上是关于如何在 SwiftUI 中从减去的子视图中关闭视图的主要内容,如果未能解决你的问题,请参考以下文章
SwiftUI中sheet弹出嵌在NavigationView中的子视图无法用presentationMode关闭(dismiss)弹出视图的解决
SwiftUI中sheet弹出嵌在NavigationView中的子视图无法用presentationMode关闭(dismiss)弹出视图的解决
在 SwiftUI 中从 Observable 视图模型初始化 Map
如何通过单击按钮在 Swift UI 中从一个视图导航到另一个视图
iOS 16.2 在 SwiftUI 子视图中无法关闭弹出的(sheet)导航视图(NavigationView)之解决