SwiftUI - 根据条件添加导航栏按钮

Sco*_*her 10 conditional-statements ios swiftui

鉴于我有这样的看法..

@State var tabIndex: Int = 0
           
 var body: some View {

  TabView(selection: $tabIndex)
  {
   Text("Tab 1").tabItem({
    Image(systemName: "message")
   }).tag(0)           
                
   Text("Tab 2").tabItem({
    Image(systemName: "arkit")
   }).tag(1)             
          
   Text("Tab 3").tabItem({
    Image(systemName: "battery.100")
   }).tag(2)
  }.navigationBarTitle("Tabbed View")
            
 }
Run Code Online (Sandbox Code Playgroud)

这会产生一个这样的视图,这是预期的:

在此处输入图片说明

在我可以使用的栏中添加导航按钮

 .navigationBarItems(trailing:
  Button(action: {print("Button was tapped")}) {
   Image(systemName: "plus")
    .resizable().frame(width: 20, height: 20)
  })
Run Code Online (Sandbox Code Playgroud)

预期添加按钮

有没有办法只根据条件添加(或显示)按钮?

if (self.tabIndex == 1){
  show button
}
else {
 don't show button
}
Run Code Online (Sandbox Code Playgroud)

sal*_*t5r 21

由于.navigationBarItems在 iOS 的未来版本中将被弃用,因此最好使用.toolbar(_:)视图修改器。

.toolbar {
    ToolbarItemGroup(placement: .navigationBarTrailing) {
        if tabIndex == 2 {
            // show button
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这应该是新接受的答案 (2认同)

Asp*_*eri 16

这是可能的方法

.navigationBarItems(trailing: self.tabIndex == 1 ? 
    AnyView(self.trailingButton) : AnyView(EmptyView()))
Run Code Online (Sandbox Code Playgroud)

下面某处 body

var trailingButton: some View {
  Button(action: {print("Button was tapped")}) {
   Image(systemName: "plus")
    .resizable().frame(width: 20, height: 20)
  }
}
Run Code Online (Sandbox Code Playgroud)


use*_*004 5

如果您不想使用AnyView,也可以使用Groupor Opacity

.navigationBarItems(trailing: Group {
  if self.tabIndex == 1 {
    Button(action: {print("Button was tapped")}) {
     Image(systemName: "plus")
      .resizable().frame(width: 20, height: 20)
    }
  }
})
Run Code Online (Sandbox Code Playgroud)
.navigationBarItems(trailing: 
    Button(action: {print("Button was tapped")}) {
     Image(systemName: "plus")
      .resizable().frame(width: 20, height: 20)
    }.opacity(self.tabIndex == 1 ? 1 : 0)
)
Run Code Online (Sandbox Code Playgroud)