Как реализовать функцию удаления и перемещения с помощью инфраструктуры SwiftUI - PullRequest
3 голосов
/ 07 июня 2019

Невозможно удалить и переместить строку в для элемента в представлении списка.

Apple предоставила в своих обучающих видео эти методы, но они не работают

Для удаления:

array.remove(atOffsets: IndexSet)

Для переезда:

array.move(fromOffsets: IndexSet, toOffset: Int)

Оба эти метода недоступны в документации Apple.

Simulator Screen

Ответы [ 3 ]

2 голосов
/ 20 июня 2019

Эти методы являются частью стандартной библиотеки Swift 5.1, которую Apple сделает доступной с будущей бета-версией Xcode.А пока вы можете использовать следующие расширения:

extension Array {
    mutating func remove(atOffsets offsets: IndexSet) {
        let suffixStart = halfStablePartition { index, _ in
            return offsets.contains(index)
        }
        removeSubrange(suffixStart...)
    }

    mutating func move(fromOffsets source: IndexSet, toOffset destination: Int) {
        let suffixStart = halfStablePartition { index, _ in
            return source.contains(index)
        }
        let suffix = self[suffixStart...]
        removeSubrange(suffixStart...)
        insert(contentsOf: suffix, at: destination)
    }

    mutating func halfStablePartition(isSuffixElement predicate: (Index, Element) -> Bool) -> Index {
        guard var i = firstIndex(where: predicate) else {
            return endIndex
        }

        var j = index(after: i)
        while j != endIndex {
            if !predicate(j, self[j]) {
                swapAt(i, j)
                formIndex(after: &i)
            }
            formIndex(after: &j)
        }
        return i
    }

    func firstIndex(where predicate: (Index, Element) -> Bool) -> Index? {
        for (index, element) in self.enumerated() {
            if predicate(index, element) {
                return index
            }
        }
        return nil
    }
}
2 голосов
/ 07 июня 2019

удаление элемента

TLDR:

.onDelete{index in
                self.array.remove(at: index.first!)

        }

полный код (можно скопировать вставить):

import SwiftUI

struct MyTableView : View {

 @State var array=[1,2,3,4,5]

    var body: some View {

        List{
            ForEach(array){element in
                Text("\(element)")
                }
                .onDelete{index in
                    self.array.remove(at: index.first!)

            }
        }

    }
}

#if DEBUG
struct MyTableView_Previews : PreviewProvider {
    static var previews: some View {
        MyTableView()
    }
}
#endif
1 голос
/ 15 июня 2019

Они либо использовали пользовательские расширения для Array, либо какую-то версию Swift, еще не доступную для публики. Обходные пути, которые я реализовал:

удалить


func delete(at offsets: IndexSet) {
    if let first = offsets.first {
        store.rooms.remove(at: first)
    }
}

двигаться


func move(from source: IndexSet, to destination: Int) {
    if let first = source.first {
        store.rooms.swapAt(first, destination)
    }
}

Функция перемещения работает, однако, анимация не так хороша, как на видео на WWDC 2019.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...