Search code examples
iosswiftxcodeswiftui

SwiftUI set navigationViewStyle based on device


I'm trying to get my navigation view style to be stacked on iPad but default on iPhone.

Code:

.navigationViewStyle(UIDevice.current.userInterfaceIdiom == .pad ? StackNavigationViewStyle() : DefaultNavigationViewStyle())

Giving me the error:

Result values in '? :' expression have mismatching types 'StackNavigationViewStyle' and 'DefaultNavigationViewStyle'

Are these not both NavigationViewStyle subclasses?


Solution

  • I recommend to extract it into simple wrapper modifier and use it in place where needed. Here is modifier:

    Update:

    extension View {
        @ViewBuilder
        public func currentDeviceNavigationViewStyle() -> some View {
            if UIDevice.current.userInterfaceIdiom == .pad {
                self.navigationViewStyle(StackNavigationViewStyle())
            } else {
                self.navigationViewStyle(DefaultNavigationViewStyle())
            }
        }
    }
    

    SwiftUI 1.0 (backward-compatible)

    extension View {
        public func currentDeviceNavigationViewStyle() -> AnyView {
            if UIDevice.current.userInterfaceIdiom == .pad {
                return AnyView(self.navigationViewStyle(StackNavigationViewStyle()))
            } else {
                return AnyView(self.navigationViewStyle(DefaultNavigationViewStyle()))
            }
        }
    }