我创建了一个显示内容和两个按钮(上一个和下一个)的自定义视图。请在下面找到该结构的代码:
struct PageNavigator<Content: View>: View {
var prevAction: () -> Void
var nextAction: () -> Void
private let content: () -> Content
init(prevAction: @escaping () -> Void, nextAction: @escaping () -> Void, @ViewBuilder content: @escaping () -> Content) {
self.prevAction = prevAction
self.nextAction = nextAction
self.content = content
}
var body: some View {
VStack {
content()
HStack {
Button(action: { self.prevAction() }) {
HStack{
Image(systemName: "chevron.left.circle.fill")
Text("Prev")
.multilineTextAlignment(.leading)
}
}
Spacer()
Button(action: { self.nextAction() }) {
HStack{
Text("Next")
.multilineTextAlignment(.trailing)
Image(systemName: "chevron.right.circle.fill")
}
}
}
.padding()
}.padding()
}
这就是从父视图使用它的方式
PageNavigator(prevAction: {
if (self.pageToDisplay > 0){
self.pageToDisplay = self.pageToDisplay - 1
}else{
self.pageToDisplay = 0
}
}, nextAction: {
self.pageToDisplay = self.pageToDisplay + 1
}){
//content to display
Spacer()
if(self.pageToDisplay < self.messages.count){
//show walkthrough
MessageView(title: self.messages[self.pageToDisplay].title , content: self.messages[self.pageToDisplay].message)
}else{
if(self.pageToDisplay == self.messages.count){
TermsAgreementView(pageToDisplay: self.$pageToDisplay)
}else if(self.pageToDisplay == self.messages.count + 1){
SetBaseCurrencyView()
}else if(self.pageToDisplay == self.messages.count + 2){
SmartRemindersView()
}else if(self.pageToDisplay == self.messages.count + 3){
GetStartedView()
}
else{
MessageView(title: "Test page \(self.messages.count)", content: "Test")
}
}
Spacer()
}
现在,我想要实现的是添加一个属性,该属性使我可以在父视图中显示或隐藏上一个或下一个按钮。什么是有效的方法?我尝试添加@Binding showNextButton:Bool和@Binding showPrevButton:Bool。但是它没有按预期工作。
提前致谢!
跟进/更新
因此,下面提出的解决方案有效,但是我有后续行动。因此,我创建了2个属性showNextBtn和showPrevBtn来显示/隐藏2个导航按钮。但是我想将它们设为可选,这样我就不必提供这两个参数。因此,如果未提供2个参数,则应隐藏2个按钮。我更新了如下代码:
struct PageNavigator<Content: View>: View {
var prevAction: () -> Void
var nextAction: () -> Void
private let content: () -> Content
@Binding var showNextBtn: Bool?
@Binding var showPrevBtn: Bool?
init(showNextBtn: Binding<Bool?>?, showPrevBtn: Binding<Bool?>?, prevAction: @escaping () -> Void, nextAction: @escaping () -> Void, @ViewBuilder content: @escaping () -> Content) {
self.prevAction = prevAction
self.nextAction = nextAction
self.content = content
if showNextBtn != nil{
self._showNextBtn = showNextBtn!
}else{
self._showNextBtn = Binding.constant(false)
}
if showPrevBtn != nil{
self._showPrevBtn = showPrevBtn!
}else{
self._showPrevBtn = Binding.constant(false)
}
}
var body: some View {
VStack {
content()
HStack {
if self.showPrevBtn!{
Button(action: { self.prevAction() }) {
HStack{
Image(systemName: "chevron.left.circle.fill")
Text("Prev")
.multilineTextAlignment(.leading)
}
}
}
Spacer()
if self.showNextBtn!{
Button(action: { self.nextAction() }) {
HStack{
Text("Next")
.multilineTextAlignment(.trailing)
Image(systemName: "chevron.right.circle.fill")
}
}
}
}
.padding()
}.padding()
}
因此,我将上述视图用于父视图:
PageNavigator(showNextBtn: $showNextBtn, showPrevBtn: $showPrevBtn, prevAction: {
if (self.pageToDisplay > 0){
self.pageToDisplay = self.pageToDisplay - 1
}else{
self.pageToDisplay = 0
}
}, nextAction: {
self.pageToDisplay = self.pageToDisplay + 1...
但是我收到错误:对于$ showNextBtn和$ showPrevBtn参数,“无法将类型'Binding'的值转换为预期的参数类型'Binding?'”。我在这里想念什么吗?
谢谢!
我实现了您要求使用@Binding的功能。这是我做的
struct PageNavigator<Content: View>: View {
var prevAction: () -> Void
var nextAction: () -> Void
private let content: () -> Content
@Binding var showNext : Bool
init(showNext : Binding<Bool> , prevAction: @escaping () -> Void, nextAction: @escaping () -> Void, @ViewBuilder content: @escaping () -> Content) {
self.prevAction = prevAction
self.nextAction = nextAction
self.content = content
self._showNext = showNext
}
var body: some View {
VStack {
...
if self.showNext {
Button(action: { self.nextAction() }) {
HStack{
Text("Next")
.multilineTextAlignment(.trailing)
Image(systemName: "chevron.right.circle.fill")
}
}
}
...
}
}
现在从父母那里:
@State var showNext : Bool = true
...
PageNavigator( showNext : self.$showNext, prevAction: {
if (self.pageToDisplay > 0){
--->
self.showNext.toggle() // = false , true
}else{
self.pageToDisplay = 0
}
}, nextAction: {
self.pageToDisplay = self.pageToDisplay + 1
},content: {
...
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句