【问题标题】:SwiftUI set navigationViewStyle based on deviceSwiftUI基于设备设置navigationViewStyle
【发布时间】:2019-12-02 18:52:19
【问题描述】:

我正在尝试让我的导航视图样式堆叠在 iPad 上,但默认在 iPhone 上。

代码:

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

给我错误:

'? 中的结果值:' 表达式有不匹配的类型 'StackNavigationViewStyle' 和 'DefaultNavigationViewStyle'

这两个不是 NavigationViewStyle 的子类吗?

【问题讨论】:

  • 不,它们是结构体,NavigationViewStyle 是协议。
  • 那我该怎么做?

标签: ios swift xcode swiftui


【解决方案1】:

我建议将它提取到简单的包装修饰符中,并在需要的地方使用它。这是修饰符:

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

【讨论】:

  • 这很简单直接,但会导致丢失View 类型。
  • 如果它在修饰符列表中的最后一个没关系,但仍然有效。而且.navigationViewStyle本身返回不透明视图,所以没有区别。
  • 这在 Xcode 12.5 中对我不起作用。它导致编译错误“实例方法'navigationViewStyle'要求'AnyView'符合'NavigationViewStyle'”
【解决方案2】:

那是因为? : 应该总是返回相同类型的值。

您可以像这样实现自定义条件修饰符扩展:

extension View {
    public func modify<T, U>(if condition: Bool, then modifierT: T, else modifierU: U) -> some View where T: ViewModifier, U: ViewModifier {
        Group {
            if condition {
                modifier(modifierT)
            } else {
                modifier(modifierU)
            }
        }
    }
}

像这样实现自定义修饰符:

struct IPadNavigationViewStyle: ViewModifier {
    func body(content: Content) -> some View { content.navigationViewStyle(StackNavigationViewStyle()) }
}

struct IPhoneNavigationViewStyle: ViewModifier {
    func body(content: Content) -> some View { content.navigationViewStyle(DefaultNavigationViewStyle()) }
}

然后像这样使用它:

    .modify(if: UIDevice.current.userInterfaceIdiom == .pad, then: IPadNavigationViewStyle(), else: IPhoneNavigationViewStyle() )

【讨论】:

  • 很好的解决方案!
猜你喜欢
  • 2020-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-23
  • 1970-01-01
  • 1970-01-01
  • 2021-01-23
  • 2017-01-15
相关资源
最近更新 更多