SwiftUI: многоплатформенное приложение swiftui неожиданное состояние платформы

#ios #swift #macos #swiftui-list #xcode12beta6

#iOS #swift #macos #swiftui-список #xcode12beta6

Вопрос:

Я пытаюсь реализовать список в многоплатформенной реализации, вот моя реализация:

 struct ContentView: View {
    var body: some View {
        List {
            Section(header: Text("Header"), footer: Text("Footer")){
                ForEach(0..<5){
                    Text("($0)")
                        .tag($0)
                }
            }
            #if os(iOS)
                .listStyle(GroupedListStyle())
            #endif
        }
    }
}
  

Но в этой строке:

 .listStyle(GroupedListStyle())
  

Я получаю эту ошибку:

 Unexpected platform condition (expected `os`, `arch`, or `swift`)
  

Кто-нибудь из вас знает способ обойти эту ошибку?

Я буду очень признателен за вашу помощь

Комментарии:

1. @Paulw11, исправьте, это причина, по которой я добавляю #if os(iOS) . Нужно ли добавлять альтернативу?

Ответ №1:

SwiftUI не очень любит код условной компиляции.

Попробуйте что-то вроде этого:

 #if os(macOS)
typealias MyListStyle = PlainListStyle
#else
typealias MyListStyle = GroupedListStyle
#endif
...
SomeView {}
.listStyle(MyListStyle())
  

Или

 func myListStyle() -> some View {
    #if os(macOS)
    return listStyle(PlainListStyle())
    #else
    return listStyle(GroupedListStyle())
    #endif
}
...
SomeView {}
.myListStyle()
  

Вы также можете использовать вариант func с возвращаемым self для модификаторов, которые не подходят. Я также использовал его для создания .environment условий.

Комментарии:

1. Я реализовал ваше решение, но я получаю и ошибку в этой строке Section(header , ошибка: Instance method "listStyle" requieres that some view conform to ListStyle

2. Вы можете применить только .listStyle к List форме или, возможно, к форме или стеку. Вероятно, это не работает на Section . Это то, что говорит вам компилятор. SwiftUI часто выдает загадочные сообщения об ошибках, но это очень простое и конкретное.