проблема с if #available SwiftUI меньше, чем iOS 14

#swiftui

#swiftui

Вопрос:

Я использую бета-версию Xcode 12.0, чтобы поиграть с LazyVGrid, для отображения этой сетки в scrollview, если на телефоне установлена iOS 14, в противном случае просто для отображения ScrollView в виде одного столбца.

Когда я запускаю это в приложении на своем телефоне (не используя iOS 14), открытие этого представления приводит к сбою моего приложения. Но если я закомментирую раздел «if #available» и просто покажу, что находится в инструкции «else», все будет работать нормально.

Есть ли проблема с if #available в более ранних версиях iOS или мой синтаксис просто неверен?

     var body: some View {
        NavigationView {
            VStack {
                //Empty View navigation link to choose the selected pack in User Defaults.
                ScrollView(.vertical, showsIndicators: false) {
                    //Checks if iOS version 14.0 is available to render the lazy grid view
                    if #available(iOS 14.0, *) {

                        LazyVGrid(columns: [GridItem(.flexible()), GridItem(.flexible())], spacing: 15) {
                                //checks if the pack is in the purchased list - if so, renders it as an unlocked tile.
                            ForEach((allPacks), id: .self) { pack in
                                    UnlockedPackTile(tilePack: pack)
                                        .onTapGesture {
                                            print("Originally tapped (pack.name)")
                                            self.userInformation.defaultPack = pack
                                            self.isPresented.toggle()
                                }
                            }
                        }
                    } else {
                            //does this as a simple stack instead if iOS 14 is not available.
                            ForEach((allPacks), id: .self) { pack in
                                    UnlockedPackTile(tilePack: pack)
                                        .onTapGesture {
                                            print("Originally tapped (pack.name)")
                                            self.userInformation.defaultPack = pack
                                            self.isPresented.toggle()
                            }
                        }
                    }
                }
  

Ответ №1:

Попробуйте обернуть содержимое ScrollView в Group (или VStack ) как

 ScrollView(.vertical, showsIndicators: false) {
   Group {
      if #available(iOS 14.0, *) {
          // ... new content here
      } else {
          // ... old content here
      }
   }
} 
  

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

1. Я попытался поместить его в группу, и это, похоже, не помогло это исправить, но я не уверен, что вы имеете в виду под комментарием об этом, если он не находится на уровне тела? Он содержится в теле внутри структуры представления. В этом проблема?