SwiftUI模态表示仅可从navigationBarItems进行一次
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SwiftUI模态表示仅可从navigationBarItems进行一次相关的知识,希望对你有一定的参考价值。
[当您从导航栏项目内的按钮显示模式时,这是SwiftUI中的错误。在下面的代码中,按钮1可以正常工作,但是按钮2只能工作一次:
struct DetailView: View
@Binding var isPresented: Bool
@Environment (\.presentationMode) var presentationMode
var body: some View
NavigationView
Text("OK")
.navigationBarTitle("Details")
.navigationBarItems(trailing: Button(action:
self.isPresented = false
// or:
// self.presentationMode.wrappedValue.dismiss()
)
Text("Done").bold()
)
struct ContentView: View
@State var showSheetView = false
var body: some View
NavigationView
Group
Text("Master")
Button(action: self.showSheetView.toggle() )
Text("Button 1")
.navigationBarTitle("Main")
.navigationBarItems(trailing: Button(action:
self.showSheetView.toggle()
)
Text("Button 2").bold()
)
.sheet(isPresented: $showSheetView)
DetailView(isPresented: self.$showSheetView)
此错误来自去年中,至今仍在Xcode 11.3.1 + ios 13.3 Simulator和iOS 13.3.1 iPhone XS中。
这里有什么解决方法可以使按钮起作用?
编辑:
- 似乎是要点击的区域在某处向下,可以点击下面的按钮以显示模式。
临时解决方案是使用嵌入式导航栏模式:.navigationBarTitle("Main", displayMode: .inline)
答案
好,问题在于工作表关闭后导航栏按钮的布局不正确(似乎折断了约束)
在视图层次结构调试中清晰可见:
这里是一个修复程序(当然,解决方法是安全的,因为即使在解决问题之后,它仍会继续工作)。这个想法不是与残缺的布局作斗争,而是创建另一个按钮,因此布局引擎本身会删除旧的不良按钮并添加新的刷新布局。众所周知的工具-使用.id()
修改后的代码:
struct ContentView: View
@State var showSheetView = false
@State private var navigationButtonID = UUID()
var body: some View
NavigationView
Group
Text("Master")
Button(action: self.showSheetView.toggle() )
Text("Button 1")
.navigationBarTitle("Main")
.navigationBarItems(trailing: Button(action:
self.showSheetView.toggle()
)
Text("Button 2").bold()
.id(self.navigationButtonID)) // force new instance creation
.sheet(isPresented: $showSheetView)
DetailView(isPresented: self.$showSheetView)
.onDisappear
// update button id after sheet got closed
self.navigationButtonID = UUID()
以上是关于SwiftUI模态表示仅可从navigationBarItems进行一次的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 SwiftUI 在模态视图中创建 NSManagedObject?