Swiftui: обнаружение запуска onMove

#list #swiftui

#Список #swiftui

Вопрос:

Цель: я хотел бы иметь возможность настраивать шаговый шаг в режиме редактирования, но когда пользователь начинает перемещать строку заголовка, либо перетащите шаговый шаг вместе с ним, либо скройте все шаговые строки, пока перемещение не будет завершено.

Текущий: когда пользователь перемещает строку заголовка, он перемещается между всеми строками, а не только между строками заголовка.

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

Код:

 struct ContentView: View {
    @ObservedObject var items = ItemGroup()
    @State private var editMode = EditMode.active
    
    var body: some View {
        NavigationView{
            List {
                
                ForEach(Array(items.group.enumerated()), id: .element.id) { index, item in
                    Text(items.group[index].item)
                        .deleteDisabled(!editMode.isEditing)

                    
                    if editMode.isEditing {
                        let stepper = items.group[index].stepper
                        
                        Stepper("Stepper: (stepper)", value: $items.group[index].stepper, in: 1...10)
                            .moveDisabled(true)
                            .deleteDisabled(true)
                    }
                    
                }
                .onMove(perform: onMove)
                
            }
            .navigationBarTitle("List")
            .navigationBarItems(leading: EditButton(), trailing: addButton)
            .environment(.editMode, $editMode)
            
        }
    }
    
    
    
    private var addButton: some View {
        switch editMode {
        case .active:
            return AnyView(Button(action: onAdd) { Image(systemName: "plus") })
        default:
            return AnyView(EmptyView())
        }
    }
    
    func onAdd() {
        let newItem = SingleItem(item: "Word - (items.group.count)", supplement: [""], stepper: 1, current: 1)
        self.items.group.append(newItem)
    }
    
    
    private func onMove(source: IndexSet, destination: Int) {
        items.group.move(fromOffsets: source, toOffset: destination)
    }
}

struct SingleItem: Identifiable {
    let id = UUID()
    var item: String
    var supplement: [String]
    var stepper: Int
    var current: Int
}

class ItemGroup: ObservableObject{
    @Published var group = [SingleItem]()
}
  

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

1. Не уверен, что я понял, чего вы хотите достичь.

2. @Asperi При перемещении строки Text(items.group[index].item) в режиме редактирования я бы хотел, чтобы шаговая ячейка перетаскивалась вместе с ней. В качестве альтернативы я хотел бы, чтобы все пошаговые строки исчезли, как только строка Text(items.group[index].item) будет выбрана для перемещения, а затем снова появится после размещения.