#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 — добавил код