Как добавить Swipe Actions в список? - SwiftUI - PullRequest
0 голосов
/ 03 мая 2020

Я хочу добавить действия смахивания в свой список, чтобы показать некоторые действия.

Все, что мне нужно, это добавить некоторые действия с жестом смахивания влево в строке списка, как почтовое приложение ios.

Я нашел это решение @ michał-ziobro Модификатор действия смахивания , но оно не работает: /

Некоторые части этого кода дали мне ошибки, и я исправил их с помощью некоторых расширения, я подумал, может быть, именно поэтому он не работает.

struct TableViewConfigurator: UIViewControllerRepresentable {

    var configure: (UITableView) -> Void = { _ in }

    func makeUIViewController(context: UIViewControllerRepresentableContext<TableViewConfigurator>) -> UIViewController {

        UIViewController()
    }

    func updateUIViewController(_ uiViewController: UIViewController, context: UIViewControllerRepresentableContext<TableViewConfigurator>) {

        let tableViews = UIApplication.nonModalTopViewController()?.navigationController?.topViewController?.view.allSubViewsOf(type: UITableView.self) ?? [UITableView]()

        for tableView in tableViews {
            self.configure(tableView)
        }
    }
}

struct ListSwipeActions: ViewModifier {

    @ObservedObject var coordinator = Coordinator()

    func body(content: Content) -> some View {

        return content
            .background(TableViewConfigurator(configure: { tableView in
                DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
                    tableView.delegate = self.coordinator
                }
            }))
    }

    class Coordinator: NSObject, ObservableObject, UITableViewDelegate {

        func scrollViewDidScroll(_ scrollView: UIScrollView) {
            print("Scrolling ....!!!")
        }

        func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCell.EditingStyle {
            return .delete
        }

        func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {

            let isArchived = false
            let title = isArchived ? "Unarchive" : "Archive"

            let archiveAction = UIContextualAction(style: .normal, title: title, handler: {
                (action, view, completionHandler) in

                // update data source
                completionHandler(true)
            })
            archiveAction.title = title
            archiveAction.image = UIImage(systemName: "archivebox")!
            archiveAction.backgroundColor = .systemYellow

            let configuration = UISwipeActionsConfiguration(actions: [archiveAction])

            return configuration
        }
    }
}

extension List {

    func swipeActions() -> some View {
        return self.modifier(ListSwipeActions())
    }
}

и вот мой список:

struct NotificationsTab: View {

    @ObservedObject var viewModel = NotificationsVM()

    func delete(at offsets: IndexSet) {
        viewModel.notifications.remove(atOffsets: offsets)
    }

    var body: some View {
        NavigationView {
            Group{
                if viewModel.notifications.count > 0 {
                    List{
                        ForEach(self.viewModel.notifications, id: \.id){ notification in
                            HStack(spacing: 15){
                                WebImage(url: URL(string: notification.sender!.avatar!.userAvatarPathSmall()))
                                    .resizable()
                                    .indicator(.activity)
                                    .aspectRatio(contentMode: .fill)
                                    .animation(.easeInOut(duration: 0.5))
                                    .transition(.fade)
                                    .frame(width: 48, height: 48)
                                    .cornerRadius(24)
                                Text(notification.sender!.name!).fontWeight(.bold) + Text(notification.message!)
                            }.padding(.vertical)
                        }.onDelete(perform: delete)
                    }.swipeActions()
                }else{
                    LoadingView()
                }
            }
            .navigationBarTitle("Notifications")
        }.onAppear(){
            self.viewModel.getNotifications()
        }
    }
}

struct NotificationsTab_Previews: PreviewProvider {
    static var previews: some View {
        NotificationsTab()
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...