В строке темы сказано все.
Когда я запускаю код из Xcode, запись сохраняется, но без значений, когда я снова запускаю приложение из Xcode, чтобы проверить, правильно ли сохраняются записи. Однако когда я запускаю приложение прямо из симулятора, оно работает нормально. И во время работы из симулятора я убиваю приложение в фоновом режиме, чтобы убедиться, что оно перезапускается с самого начала. Он просто отлично работает.
Здесь я загрузил два видео — «Запуск из Xcode» и «Запуск из симулятора», чтобы показать проблему и то, как она работает нормально при запуске непосредственно из симулятора.
Код SwiftData, который я использую:
Приложение:
import SwiftUI
import SwiftData
@main
struct PennywiseApp: App {
var sharedModelContainer: ModelContainer = {
let schema = Schema([
Transaction.self,
Category.self
])
let modelConfiguration = ModelConfiguration(schema: schema, isStoredInMemoryOnly: false)
do {
return try ModelContainer(for: schema, configurations: [modelConfiguration])
} catch {
fatalError("Could not create ModelContainer: \(error)")
}
}()
var body: some Scene {
WindowGroup {
ContentView()
}
.modelContainer(sharedModelContainer)
}
}
Модель:
import Foundation
import SwiftData
import SwiftUI
@Model
final class Category {
var name: String
var hex: String
var transactionType: TransactionType
init (name: String, hex: String, transactionType: TransactionType) {
self.name = name
self.hex = hex
self.transactionType = transactionType
}
}
Тип транзакции:
enum TransactionType: String, Codable, CaseIterable, Identifiable {
var id: TransactionType {
self
}
case Income = "Income"
case Expense = "Expsense"
}
Первый просмотр:
import SwiftUI
import SwiftData
struct Categories: View {
@State var selectedCategory: Int = 0
@State var showNewCategory: Bool = false
@State var searchText: String = ""
@Environment(\.modelContext) var modelContext
@State private var path = [Category]()
@Query var categories: [Category]
var filteredCategories: [Category] {
var cat : [Category]
if selectedCategory == 0 {
cat = categories.filter { category in
category.transactionType == .Income
}
}
else {
cat = categories.filter { category in
category.transactionType == .Expense
}
}
if searchText.isEmpty {
return cat
} else {
return cat.filter { category in
category.name.localizedCaseInsensitiveContains(searchText)
}
}
}
var body: some View {
NavigationStack(path: $path) {
List {
Section {
ForEach(filteredCategories) { category in
NavigationLink(value: category) {
Circle()
.stroke(Color(hex: category.hex) ?? Color.blue, lineWidth: 3)
.fill(Color(hex: category.hex) ?? Color.blue)
.frame(width: 25, height: 25)
Text("\(category.name)")
}
}
.onDelete(perform: deleteCategory)
}
}
.navigationTitle("Categories")
.navigationDestination(for: Category.self) { category in
NewCategory(category: category)
}
.searchable(text: $searchText)
.autocorrectionDisabled()
.animation(.default, value: searchText)
.toolbar {
ToolbarItem(placement: .principal) {
Picker("Categories", selection: $selectedCategory) {
Text("Income").tag(0)
Text("Expense").tag(1)
}
.frame(width: 200)
.pickerStyle(SegmentedPickerStyle())
.onChange(of: selectedCategory) { oldValue, newValue in
print("\(oldValue) -> \(newValue)")
}
.onAppear {
UISegmentedControl.appearance().tintColor = .blue
}
}
ToolbarItem(placement: .topBarTrailing) {
Button {
showNewCategory.toggle()
addCategory()
} label: {
Image(systemName: "plus.circle.fill")
.symbolEffect(.breathe)
}
}
}
}
}
func addCategory() {
var category: Category
if selectedCategory == 0 {
category = Category(name: "", hex: "", transactionType: TransactionType.Income)
} else {
category = Category(name: "", hex: "", transactionType: TransactionType.Expense)
}
modelContext.insert(category)
try! modelContext.save()
path.append(category)
}
func deleteCategory(at offsets: IndexSet) {
for offset in offsets {
modelContext.delete(filteredCategories[offset])
}
try! modelContext.save()
}
}
#Preview {
@Previewable @State var search = ""
Categories(searchText: search)
}
Второй вид:
struct NewCategory: View {
@State var selectedFlow: Int = 0
@Bindable var category: Category
var pickerColor: Binding { //
Подробнее здесь: https://stackoverflow.com/questions/793 ... app-is-ind
SwiftData не сохраняет данные при запуске из Xcode, но работает нормально, когда приложение запускается независимо в сим ⇐ IOS
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение