SwiftUI Аварийный бокс-стол

#ios #swift #swiftui

#iOS #быстрый #свифтуи

Вопрос:

Я наблюдаю странный сбой с некоторыми бета-тестерами в тестовом полете. Похоже, это происходит при запуске приложения, но до того момента, когда мы совершаем какие-либо сетевые вызовы. В Интернете, похоже, не так много об этом говорится, и символизация тоже не очень помогает. Просто любопытно, сталкивался ли кто-нибудь с этим раньше и что они с этим делали? У меня это происходило на двух устройствах тестировщика, и я никогда не мог воссоздать проблему локально.

Для некоторого контекста я создаю представление списка на главном экране с LazyVGrid изображением, содержащим LazyHGrid внутри него элементы, которые заполнены с использованием опубликованных переменных из моей модели представления, хотя, похоже, это происходит до создания любого из них.

Спасибо за любые идеи / помощь

обозначение аварии

Изменить: Некоторые дополнительные сведения / фактический код:

Вид с сетками:

 import SwiftUI import Kingfisher  struct FeaturedView: View {    @EnvironmentObject var viewRouter: ViewRouter  @EnvironmentObject var tabRouter : TabRouter  @StateObject var loadingViewModel = LoadingViewModel()  private let imageProcessor = SVGImgProcessor()  private let playerManager = PlayerManager.shared  private var gridItemLayout = [GridItem(.flexible())]  let userDefaults = UserDefaults.standard    var body: some View {    let padding: CGFloat = 20  let paddingHStack: CGFloat = 25    GeometryReader { geometry in  ZStack(alignment: .top){  Color(hex:"#00091C").edgesIgnoringSafeArea(.all)  VStack {  HStack {  HStack {  Text("Hello, (loadingViewModel.name)")  .frame(alignment: .leading)  .multilineTextAlignment(.center)  .font(Font.custom("poppins-medium", size: 20))  .foregroundColor(Color(hex:"#667C95"))  .padding(.leading, 15)  .padding(.top, 15)  .padding(.bottom, 15)  Image("PremiumStar")  .resizable()  .frame(width: 15.0, height: 15.0)  .opacity(userDefaults.isSubscriber() ? 1 : 0)  }  Spacer()  Button(action: {  print("Settings Clicked")  viewRouter.currentPage = .settingsFlow  }) {  Image("Settings")  .resizable()  .frame(width: 22.0, height: 22.0)  .padding(15)  }  }  ScrollView(showsIndicators: false) {  VStack(spacing: 10) {  LazyVGrid(columns: gridItemLayout, spacing: 17) {  ForEach(loadingViewModel.getCategories()) { category in  Text(category.title)  .foregroundColor(.white)  .font(Font.custom("poppins-bold", size: 30))  ZStack {  KFImage(URL(string: (category.background?.svg!)!))  .resizable()  .setProcessor(imageProcessor)  .frame(width: geometry.size.width - padding, height: 175, alignment: .topLeading)  .aspectRatio(contentMode: .fill)  .clipped()  .cornerRadius(5)  ScrollView(.horizontal, showsIndicators: false) {  LazyHGrid(rows: gridItemLayout, spacing: 20){  ForEach(loadingViewModel.getSoundsForCategory(category: category.key)) { sound in  Button(action: {  playerManager.play(sound: sound)  }) {  VStack {  ZStack{  RoundedRectangle(cornerRadius: 5).frame(width: 90, height: 90)  .foregroundColor(Color.black)  .opacity(0.85)  ZStack(alignment:.bottomTrailing){  KFImage(URL(string: sound.icon.png!)!)  .resizable()  .renderingMode(.template)  .foregroundColor(.white)  .frame(width: 75, height: 75)  .aspectRatio(contentMode: .fill)  .clipped()  Image("LockIcon")  .frame(width: 12, height: 12, alignment: .bottomTrailing)  .aspectRatio(contentMode: .fill)  .clipped()  .hidden(loadingViewModel.isSubscriber || sound.tier != 2)  }  }  Text(sound.name)  .foregroundColor(.white)  .font(Font.custom("poppins-regular", size: 12))  .lineLimit(1)  .frame(minWidth: 0, idealWidth: 90, maxWidth: 100, alignment: .center)  }  }  }  }.padding(.horizontal)  }  .frame(width: geometry.size.width - paddingHStack, height: 175, alignment: .topLeading)  }  Button("Explore All"){  print("Explore All (category.title) Tapped")  tabRouter.categoryKey = category.key  tabRouter.hasChanged = true  tabRouter.currentTab = 1  }  .font(Font.custom("poppins-bold", size: 15))  .foregroundColor(Color.white)  }  }.padding(.bottom, 120)  }  }  }  }  }  } }  struct ContentView_Previews: PreviewProvider {  static var previews: some View {  FeaturedView()  } }   

Это загружается с помощью этого представления вкладки, которое перемещается между двумя экранами, которые используют одну и ту же модель представления / загружают одни и те же данные

 // MARK: Tab View  var body: some View {  ZStack{  TabView(selection: $selectedTab){  FeaturedView()  .environmentObject(tabRouter)  .tabItem{  Label("FEATURED", image: "Featured")  }.tag(0)  .overlay(  VStack {  if (showOverlay amp;amp; !isExpanded){  playView  } else {  EmptyView()  }  }  )  SoundView()  .environmentObject(tabRouter)  .tabItem{  Label("SOUNDS", image: "Sounds")  }.tag(1)  .overlay(  VStack {  if (showOverlay amp;amp; !isExpanded){  playView  } else {  EmptyView()  }  }  )  }  }  }  

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

1. Пожалуйста, приведите минимальный рабочий пример вашей проблемы. В противном случае будет трудно оказать конкретную помощь.

2. Спасибо за комментарий, @JanBrinker — добавил код