仅将 SidebarListStyle() 应用于 Mac
Apply SidebarListStyle() to Mac only
在我的 Catalyst 项目中,我只想将 SidebarListStyle()
应用到 Mac。
我的问题是我无法构建项目,即使我检查了 OS。这是一个例子:
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' is unavailable in iOS
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
}
如果您的内容比这更复杂,那么这将无法扩展。相反,请考虑避开 swift 的 auto-return 部分并通过以下方式生成相同的内容:
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
中,这样我就可以在本地切换到那里,而不会混淆视图创建调用站点。
我发现如果您的代码非常相似,除了不同的值,并且每个平台都需要进行少量添加,我发现它可以更好地工作。
这是我的做法:
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())
在我的 Catalyst 项目中,我只想将 SidebarListStyle()
应用到 Mac。
我的问题是我无法构建项目,即使我检查了 OS。这是一个例子:
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' is unavailable in iOS
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
}
如果您的内容比这更复杂,那么这将无法扩展。相反,请考虑避开 swift 的 auto-return 部分并通过以下方式生成相同的内容:
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
中,这样我就可以在本地切换到那里,而不会混淆视图创建调用站点。
我发现如果您的代码非常相似,除了不同的值,并且每个平台都需要进行少量添加,我发现它可以更好地工作。
这是我的做法:
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())