У меня есть два выбираемых списка, первый заполнен объектами категории модели, а второй с подкатегорием модельными объектами (которые взяты из выбранной категории Значение первого списка).
Когда я удаляю элемент из первого списка, второй список не обновляется. Вот видео, которое показывает, что я имею в виду: https://youtube.com/shorts/vjce_uk0tnaобразное.private var selectedCategoryBinding: Binding
{
return Binding(get: { self.categories.max(by: { ($0.lastSelectedDate) < ($1.lastSelectedDate) })}, set:{_ in})
}
private var selectedSubcategoriesBinding: Binding
{
Binding(get: { self.selectedCategoryBinding.wrappedValue?.subcategories }, set: { self.selectedCategoryBinding.wrappedValue?.subcategories = $0 })
}
< /code>
Я боюсь, что это может быть там, где проблема лежит, но я не уверен, как ее исправить. Ниже приведен полный код. Любая помощь будет оценена. < /P>
import SwiftUI
import SwiftData
protocol SelectableListItem: Equatable, Identifiable, PersistentModel {
var name: String { get set }
var lastSelectedDate: Date { get set }
}
@Model
final class Project1 {
var name: String = ""
@Relationship(deleteRule: .cascade, inverse: \Category1.project) var categories: [Category1]?
init(name: String) {
self.name = name
}
}
@Model
final class Category1: SelectableListItem {
var name: String = ""
@Relationship(deleteRule: .cascade, inverse: \Subcategory1.category) var subcategories: [Subcategory1]?
var project: Project1?
var lastSelectedDate: Date = Date.now
init(name: String) {
self.name = name
}
}
@Model
final class Subcategory1: SelectableListItem {
var name: String = ""
var category: Category1?
var lastSelectedDate: Date = Date.now
init(name: String) {
self.name = name
}
}
struct HomeView: View {
@Environment(\.modelContext) private var modelContext
@Query private var queriedProjects: [Project1]
var body: some View {
NavigationStack {
VStack {
List {
ForEach(queriedProjects) { project in
if let categoriesBinding = Binding(
Binding(
get: { project.categories },
set: { project.categories = $0 }
)
) {
NavigationLink(
destination: ProjectView1(project: project, categories: categoriesBinding),
label: { Text(project.name) }
)
}
}
}
.toolbar {
ToolbarItem(placement: .navigationBarTrailing) {
Button {
let project = Project1(name: "Project 1")
let subcategory1 = Subcategory1(name: "Subcategory 1")
let subcategory2 = Subcategory1(name: "Subcategory 2")
let subcategory3 = Subcategory1(name: "Subcategory 3")
let subcategory4 = Subcategory1(name: "Subcategory 4")
let category1 = Category1(name: "Category 1")
category1.subcategories = [subcategory1, subcategory2]
let category2 = Category1(name: "Category 2")
category2.subcategories = [subcategory3, subcategory4]
project.categories = [category1, category2]
modelContext.insert(project)
} label: {
Label("Plus", systemImage: "plus")
}
}
}
}
.overlay {
if queriedProjects.isEmpty {
Text("Tap the + button to create a new project")
}
}
.task {
do {
try modelContext.delete(model: Project1.self)
} catch {
fatalError(error.localizedDescription)
}
}
}
.navigationSplitViewStyle(.balanced)
}
}
struct ProjectView1: View {
@Bindable var project: Project1
@Binding var categories: [Category1]
@Environment(\.editMode) private var editMode
@Environment(\.modelContext) private var modelContext
@State private var columnVisibility: NavigationSplitViewVisibility = .all
private var selectedCategoryBinding: Binding {
Binding(
get: { categories.max(by: { $0.lastSelectedDate < $1.lastSelectedDate }) },
set: { _ in }
)
}
private var selectedSubcategoriesBinding: Binding {
Binding(
get: { selectedCategoryBinding.wrappedValue?.subcategories },
set: { selectedCategoryBinding.wrappedValue?.subcategories = $0 }
)
}
var body: some View {
NavigationSplitView(columnVisibility: $columnVisibility) {
SelectableList(items: $categories) { category in
category.project = nil
}
if !categories.isEmpty {
if let subcategoriesBinding = Binding(selectedSubcategoriesBinding) {
SelectableList(items: subcategoriesBinding) { subcategory in
subcategory.category = nil
}
}
}
} detail: {
EmptyView()
}
}
}
struct SelectableList: View {
@Binding var items: [T]
private(set) var deleteItem: (T) -> Void
@Environment(\.modelContext) private var modelContext
@Query private var queriedItems: [T]
private var filteredAndSortedItems: [T] {
queriedItems
.filter { items.contains($0) }
.sorted { $0.name.localizedCaseInsensitiveCompare($1.name) == .orderedAscending }
}
private var selectedItem: T? {
filteredAndSortedItems.max(by: { $0.lastSelectedDate < $1.lastSelectedDate })
}
var body: some View {
List {
ForEach(filteredAndSortedItems) { item in
HStack {
Button {
if selectedItem != item {
item.lastSelectedDate = .now
}
} label: {
Text(item.name)
}
.buttonStyle(PlainButtonStyle())
if selectedItem == item {
Image(systemName: "checkmark")
}
Spacer()
Button {
deleteItem(item)
modelContext.delete(item)
} label: {
Image(systemName: "trash")
}
}
}
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/797 ... is-deleted
Список не обновляется, когда элемент удален ⇐ IOS
Программируем под IOS
-
Anonymous
1754076456
Anonymous
У меня есть два выбираемых списка, первый заполнен объектами категории модели, а второй с подкатегорием модельными объектами (которые взяты из выбранной категории Значение первого списка).
Когда я удаляю элемент из первого списка, второй список не обновляется. Вот видео, которое показывает, что я имею в виду: https://youtube.com/shorts/vjce_uk0tnaобразное.private var selectedCategoryBinding: Binding
{
return Binding(get: { self.categories.max(by: { ($0.lastSelectedDate) < ($1.lastSelectedDate) })}, set:{_ in})
}
private var selectedSubcategoriesBinding: Binding
{
Binding(get: { self.selectedCategoryBinding.wrappedValue?.subcategories }, set: { self.selectedCategoryBinding.wrappedValue?.subcategories = $0 })
}
< /code>
Я боюсь, что это может быть там, где проблема лежит, но я не уверен, как ее исправить. Ниже приведен полный код. Любая помощь будет оценена. < /P>
import SwiftUI
import SwiftData
protocol SelectableListItem: Equatable, Identifiable, PersistentModel {
var name: String { get set }
var lastSelectedDate: Date { get set }
}
@Model
final class Project1 {
var name: String = ""
@Relationship(deleteRule: .cascade, inverse: \Category1.project) var categories: [Category1]?
init(name: String) {
self.name = name
}
}
@Model
final class Category1: SelectableListItem {
var name: String = ""
@Relationship(deleteRule: .cascade, inverse: \Subcategory1.category) var subcategories: [Subcategory1]?
var project: Project1?
var lastSelectedDate: Date = Date.now
init(name: String) {
self.name = name
}
}
@Model
final class Subcategory1: SelectableListItem {
var name: String = ""
var category: Category1?
var lastSelectedDate: Date = Date.now
init(name: String) {
self.name = name
}
}
struct HomeView: View {
@Environment(\.modelContext) private var modelContext
@Query private var queriedProjects: [Project1]
var body: some View {
NavigationStack {
VStack {
List {
ForEach(queriedProjects) { project in
if let categoriesBinding = Binding(
Binding(
get: { project.categories },
set: { project.categories = $0 }
)
) {
NavigationLink(
destination: ProjectView1(project: project, categories: categoriesBinding),
label: { Text(project.name) }
)
}
}
}
.toolbar {
ToolbarItem(placement: .navigationBarTrailing) {
Button {
let project = Project1(name: "Project 1")
let subcategory1 = Subcategory1(name: "Subcategory 1")
let subcategory2 = Subcategory1(name: "Subcategory 2")
let subcategory3 = Subcategory1(name: "Subcategory 3")
let subcategory4 = Subcategory1(name: "Subcategory 4")
let category1 = Category1(name: "Category 1")
category1.subcategories = [subcategory1, subcategory2]
let category2 = Category1(name: "Category 2")
category2.subcategories = [subcategory3, subcategory4]
project.categories = [category1, category2]
modelContext.insert(project)
} label: {
Label("Plus", systemImage: "plus")
}
}
}
}
.overlay {
if queriedProjects.isEmpty {
Text("Tap the + button to create a new project")
}
}
.task {
do {
try modelContext.delete(model: Project1.self)
} catch {
fatalError(error.localizedDescription)
}
}
}
.navigationSplitViewStyle(.balanced)
}
}
struct ProjectView1: View {
@Bindable var project: Project1
@Binding var categories: [Category1]
@Environment(\.editMode) private var editMode
@Environment(\.modelContext) private var modelContext
@State private var columnVisibility: NavigationSplitViewVisibility = .all
private var selectedCategoryBinding: Binding {
Binding(
get: { categories.max(by: { $0.lastSelectedDate < $1.lastSelectedDate }) },
set: { _ in }
)
}
private var selectedSubcategoriesBinding: Binding {
Binding(
get: { selectedCategoryBinding.wrappedValue?.subcategories },
set: { selectedCategoryBinding.wrappedValue?.subcategories = $0 }
)
}
var body: some View {
NavigationSplitView(columnVisibility: $columnVisibility) {
SelectableList(items: $categories) { category in
category.project = nil
}
if !categories.isEmpty {
if let subcategoriesBinding = Binding(selectedSubcategoriesBinding) {
SelectableList(items: subcategoriesBinding) { subcategory in
subcategory.category = nil
}
}
}
} detail: {
EmptyView()
}
}
}
struct SelectableList: View {
@Binding var items: [T]
private(set) var deleteItem: (T) -> Void
@Environment(\.modelContext) private var modelContext
@Query private var queriedItems: [T]
private var filteredAndSortedItems: [T] {
queriedItems
.filter { items.contains($0) }
.sorted { $0.name.localizedCaseInsensitiveCompare($1.name) == .orderedAscending }
}
private var selectedItem: T? {
filteredAndSortedItems.max(by: { $0.lastSelectedDate < $1.lastSelectedDate })
}
var body: some View {
List {
ForEach(filteredAndSortedItems) { item in
HStack {
Button {
if selectedItem != item {
item.lastSelectedDate = .now
}
} label: {
Text(item.name)
}
.buttonStyle(PlainButtonStyle())
if selectedItem == item {
Image(systemName: "checkmark")
}
Spacer()
Button {
deleteItem(item)
modelContext.delete(item)
} label: {
Image(systemName: "trash")
}
}
}
}
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79722151/list-wont-update-when-item-is-deleted[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия