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()

演示2

修改后的代码:

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() // recommend .padding(.vertical) here

}

.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中工作一次 的全部内容, 来源链接: utcz.com/qa/416192.html

回到顶部