Swiftui macOS和iOS的不同列表样式

Swiftui macOS和iOS的不同列表样式,swiftui,swiftui-list,Swiftui,Swiftui List,我正在为SwiftUI上的macOS和iOS编写多平台应用程序。在iOS上,我需要以DefaultListStyle()的形式查看列表,在macOS上,我需要以SidebarListStyle()的形式查看列表。我试过: #if os(iOS) .listStyle(DefaultListStyle()) #else .listStyle(SidebarListStyle()) #endif 以及: 有几种方法可以做到这一点,不幸的是,它们都有点笨拙。以下是我在实践中使用的3种解决方案

我正在为SwiftUI上的macOS和iOS编写多平台应用程序。在iOS上,我需要以DefaultListStyle()的形式查看列表,在macOS上,我需要以SidebarListStyle()的形式查看列表。我试过:

 #if os(iOS)
.listStyle(DefaultListStyle())
 #else 
.listStyle(SidebarListStyle())
 #endif
以及:


有几种方法可以做到这一点,不幸的是,它们都有点笨拙。以下是我在实践中使用的3种解决方案

如果在
正文中有else
最直接的方法是为两种平台复制
body
中的所有内容:

struct ContentView: View {
    
    var body: some View {
        #if os(iOS)
            List {
                ...
            }
            .listStyle(DefaultListStyle())
        #else
            List {
                ...
            }
            .listStyle(SidebarListStyle())
        #endif
    }
}
显然,这会导致大量代码重复,但您可以重新组织代码以将其最小化

类型别名 对于您尝试执行的操作,我建议在代码中的某个位置定义
typealias

#if os(iOS)
typealias MyListStyle = DefaultListStyle
#else
typealias MyListStyle = SidebarListStyle
#endif
…然后您可以在任何需要的地方使用它:

.listStyle(MyListStyle())
视图修改器

如果你遇到很多这样的问题(如果你在做跨平台的SWIFTUI,你会),那么你应该考虑创建一个视图修饰符,让你执行任意代码,包括<代码> {如果OS-()/代码>检查:

extension View {
    func modify<T: View>(@ViewBuilder _ modifier: (Self) -> T) -> some View {
        return modifier(self)
    }
}

struct ContentView: View {
    var body: some View {
        List {
            ...
        }
        .modify {
            #if os(iOS) {
                $0.listStyle(DefaultListStyle())
            #else
                $0.listStyle(SidebarListStyle())
            #endif
        }
    }
}
扩展视图{
func modify(@ViewBuilder\umodifier:(Self)->T)->一些视图{
返回修饰符(自身)
}
}
结构ContentView:View{
var body:一些观点{
名单{
...
}
.修改{
#如果操作系统(iOS){
$0.listStyle(DefaultListStyle())
#否则
$0.listStyle(SidebarListStyle())
#恩迪夫
}
}
}

如果你想了解更多,我写了一篇关于最后一种方法的文章。

有几种方法可以做到这一点,不幸的是它们都有点笨拙。下面是我在实践中使用的3种解决方案

如果在
正文中有else
最直接的方法是为两种平台复制
body
中的所有内容:

struct ContentView: View {
    
    var body: some View {
        #if os(iOS)
            List {
                ...
            }
            .listStyle(DefaultListStyle())
        #else
            List {
                ...
            }
            .listStyle(SidebarListStyle())
        #endif
    }
}
显然,这会导致大量代码重复,但您可以重新组织代码以将其最小化

类型别名 对于您尝试执行的操作,我建议在代码中的某个位置定义
typealias

#if os(iOS)
typealias MyListStyle = DefaultListStyle
#else
typealias MyListStyle = SidebarListStyle
#endif
…然后您可以在任何需要的地方使用它:

.listStyle(MyListStyle())
视图修改器

如果你遇到很多这样的问题(如果你在做跨平台的SWIFTUI,你会),那么你应该考虑创建一个视图修饰符,让你执行任意代码,包括<代码> {如果OS-()/代码>检查:

extension View {
    func modify<T: View>(@ViewBuilder _ modifier: (Self) -> T) -> some View {
        return modifier(self)
    }
}

struct ContentView: View {
    var body: some View {
        List {
            ...
        }
        .modify {
            #if os(iOS) {
                $0.listStyle(DefaultListStyle())
            #else
                $0.listStyle(SidebarListStyle())
            #endif
        }
    }
}
扩展视图{
func modify(@ViewBuilder\umodifier:(Self)->T)->一些视图{
返回修饰符(自身)
}
}
结构ContentView:View{
var body:一些观点{
名单{
...
}
.修改{
#如果操作系统(iOS){
$0.listStyle(DefaultListStyle())
#否则
$0.listStyle(SidebarListStyle())
#恩迪夫
}
}
}

如果你想了解更多,我写了一篇关于最后一种方法的文章。

这回答了你的问题吗?这回答了你的问题吗?