仅将SidebarListStyle()应用于Mac

时间:2019-11-15 19:28:46

标签: ios swift swiftui catalyst

在Catalyst项目中,我只想将SidebarListStyle()应用于Mac。

我的问题是,即使我检查操作系统,也无法构建项目。这是一个例子:

struct CrossList: View {
    #if targetEnvironment(macCatalyst)
    var body: some View {
        List {
            Text("Mac Test")
        }
        .listStyle(SidebarListStyle())
    }
    #else
    var body: some View {
        List {
            Text("iOS Test")
        }
    }
    #endif
}

这在构建时给我以下错误:

  

'SidebarListStyle'在iOS中不可用

3 个答案:

答案 0 :(得分:1)

Mac Catalyst 实际上是 iOS –仅在Mac上运行。 SidebarListStyle仅在开发完整的macOS(非Catalyst)应用程序时可用,并且将包含在编译器指令#if os(macOS)中,如下所示:

struct CrossList: View {
    #if os(macOS)
    var body: some View {
        List {
            Text("Mac Test")
        }
        .listStyle(SidebarListStyle())
    }
    #else
    var body: some View {
        List {
            Text("iOS Test")
        }
    }
    #endif
}

答案 1 :(得分:1)

如果您的内容比这更复杂,那么这将无法扩展。相反,请考虑避开swift的自动返回部分,并通过以下方式生成相同内容:


var body: some View {
    var listView = List {
        Text(text)
    }

    #if os(macOS)
        listView = listView.listStyle(SidebarListStyle())
    #endif

    return listView
}

private var text: String {
    #if os(macOS)
        return "Mac Test"
    #else
        return "iOS Test"
    #endif
}

在这里,我要为两个平台设置共享的通用代码,然后有条件地在平台检查中添加内容。您还可以在共享代码中看到,我已将平台特定的值提取到专用的私有var中,因此我可以在本地切换,而不会混淆视图创建调用站点。

我发现,这在您的代码非常相似(除了不同的值)且每个平台需要进行少量添加的情况下效果更好。

答案 2 :(得分:0)

这是我的操作方式:

struct StyledSidebar<Sidebar: View>: View {
    let sidebar: Sidebar

    #if os(macOS)
    var body: some View {
        self.sidebar
        .listStyle(SidebarListStyle())
    }
    #else
    var body: some View {
        self.sidebar
    }
    #endif
}

只需致电:

StyledSidebar(sidebar: MyList())