Search code examples
iosmacosswiftuitargetmodifier

In SwiftUI, is it possible to use a modifier only for a certain os target?


Good day! In SwiftUI, is it possible to use a modifier only for a certain os target? In the following code I would like to use the modifier .listStyle(SidebarListStyle()) only for the MacOS target because it does not exist for the iOS target. Thanks for you help.

import SwiftUI

struct ContentView: View {

  @State var selection: Int?

  var body: some View {

    HStack() {
      NavigationView {
        List () {
          NavigationLink(destination: FirstView(), tag: 0, selection: self.$selection) {
            Text("Click Me To Display The First View")
          } // End Navigation Link

          NavigationLink(destination: SecondView(), tag: 1, selection: self.$selection) {
            Text("Click Me To Display The Second View")
          } // End Navigation Link

        } // End list
        .frame(minWidth: 350, maxWidth: 350)
        .onAppear {
            self.selection = 0
        }

      } // End NavigationView
        .listStyle(SidebarListStyle())
        .frame(maxWidth: .infinity, maxHeight: .infinity)

    } // End HStack
  } // End some View
} // End ContentView

struct ContentView_Previews: PreviewProvider {
  static var previews: some View {
    ContentView()
  }
}

Solution

  • your better off doing this:

     import SwiftUI
    
     struct ContentView: View {
    
    @State var selection: Int?
    
    var body: some View {
        #if targetEnvironment(macCatalyst)
        return theList.listStyle(SidebarListStyle())
        #else
        return theList.navigationViewStyle(DefaultNavigationViewStyle())
        #endif
    }
    
     var theList: some View {
     HStack() {
       NavigationView {
         List () {
           NavigationLink(destination: FirstView(), tag: 0, selection: self.$selection) {
             Text("Click Me To Display The First View")
           } // End Navigation Link
    
           NavigationLink(destination: SecondView(), tag: 1, selection: self.$selection) {
             Text("Click Me To Display The Second View")
           } // End Navigation Link
    
         } // End list
         .frame(minWidth: 350, maxWidth: 350)
         .onAppear {
             self.selection = 0
         }
    
       } // End NavigationView
         .frame(maxWidth: .infinity, maxHeight: .infinity)
    
     } // End HStack
     } // End some View
     } // End ContentView
     }