SwiftUI Как отключить удаление строк с помощью свайпа? - PullRequest
0 голосов
/ 26 октября 2019

Я использую Xcode 11.1 с SwiftUI.

Я реализовал функции удаления и сортировки списка с помощью следующего кода.

Как отключить удаление строк с помощью свайпа?

import SwiftUI

struct ContentView: View {
    @State var fruits = ["Apple",  "Orange",  "Banana"]

    var body: some View {
        NavigationView {
            List {
                ForEach(fruits, id: \.self) { fruit in
                    Text(fruit)
                }
                .onMove(perform: move)
                .onDelete(perform: delete)
            }
            .navigationBarItems(trailing: EditButton())
        }
    }

    func delete(offsets: IndexSet) {
        fruits.remove(atOffsets: offsets)
    }

    func move(source: IndexSet, destination: Int) {
        fruits.move(fromOffsets: source, toOffset: destination)
    }
}

1 Ответ

1 голос
/ 26 октября 2019

Вы можете использовать .deleteDisabled(_ isDisabled:) модификатор. Но вы должны учитывать, что тип возвращаемого значения этого модификатора - View, а не Text. Так что это немного сложнее в реализации. Вы можете использовать этот пример:

  1. Создайте CellView следующим образом:
struct CellView: View {
    var title: String
    var isDeletable: Bool

    var body: some View {
        return Text(title).deleteDisabled(!isDeletable)
    }
}

Вы можете создать свою ячейку, используя VStack s, HStack sи так далее, но вы должны рассмотреть возможность использования этого модификатора на родительском элементе этой иерархии. Как показано ниже:

var body: some View {
    HStack {
        VStack {
            ZStack {
                ...
            }
        }
    }
    .deleteDisabled(!isDeletable)
}
После этого вы можете использовать его в своем ForEach, как показано ниже:
struct ContentView: View {
    @State var fruits = ["Apple",  "Orange",  "Banana"]

    var body: some View {
        NavigationView {
            List {
                ForEach(fruits, id: \.self) { fruit -> CellView in
                    if fruit == "Orange" {
                        return CellView(title: fruit, isDeletable: true)
                    } else {
                        return CellView(title: fruit, isDeletable: false)
                    }
                }
                .onMove(perform: move)
                .onDelete(perform: delete)
            }
            .navigationBarItems(trailing: EditButton())
        }
    }

    func delete(offsets: IndexSet) {
        fruits.remove(atOffsets: offsets)
    }

    func move(source: IndexSet, destination: Int) {
        fruits.move(fromOffsets: source, toOffset: destination)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...