ios 将SidebarListStyle()仅应用于Mac

8wigbo56  于 2023-05-19  发布在  iOS
关注(0)|答案(3)|浏览(152)

在我的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中不可用

wlzqhblo

wlzqhblo1#

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
}
2w3kk1z5

2w3kk1z52#

如果你的内容比这更复杂,那么这就不能扩展。相反,考虑避开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中,这样我就可以在本地切换到那里,而不会混淆视图创建调用站点。
我发现,如果您的代码非常相似,除了不同的值,并且每个平台需要进行轻微的添加,那么这种方法可以更好地工作。

xmjla07d

xmjla07d3#

我是这么做的:

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())

相关问题