UIContextualAction удалить вопрос строки.Меню UIContextualAction перекрывает ячейку - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть две UIContextualActions, которые после завершения должны удалить строки из таблицы.Я столкнулся со следующей периодически возникающей проблемой: если я применяю эти действия очень быстро одно за другим, то первое действие работает нормально, но когда я вызываю меню UIContextualAction во второй раз, оно перекрывает ячейку.В третий раз невозможно вызвать меню UIContextualAction, пока tableView не будет прокручен. Здесь короткое видео .

Ниже приведен фрагмент кода

    //MARK: Swipe actions
override func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
    let deleteAction = self.contextualDeleteAction(forRowAtIndexPath: indexPath)
    let markAsReadAction = self.contextualMarkAsReadAction(forRowAtIndexPath: indexPath)
    let markAsUnreadAction = self.contextualMarkAsUnreadAction(forRowAtIndexPath: indexPath)
    let swipeConfig = UISwipeActionsConfiguration(actions: [
        isArchiveModeEnabled ? markAsUnreadAction : markAsReadAction,
        deleteAction
        ])

    swipeConfig.performsFirstActionWithFullSwipe = false

    return swipeConfig
}

func contextualMarkAsUnreadAction(forRowAtIndexPath indexPath: IndexPath) -> UIContextualAction {
    let action = UIContextualAction(style: .normal, title: "") { _, _, completion in
        let index = indexPath.row

        if let article = self.getSelectedArticleByIndex(index) {
            self.articlesManager.restore(article: article)
            self.refreshDataSource()
            self.tableView.deleteRows(at: [indexPath], with: .automatic)
            self.tableView.isEditing = false //seems like it helps to fix visual bug when the action is left on blank space
            completion(true)
        }
    }

    action.backgroundColor =  UIColor(patternImage: swipeActinImages.markAsUnread)

    return action
}

Функция refreshDataSource выполняет следующее:

 private func refreshDataSource() {
    articles = isArchiveModeEnabled ? dataController.getArchivedArticles() : dataController.getUnreadArticles()
}    

private func reloadTableData() {
    if dataController.getActiveUser() != nil {
        refreshDataSource()
        introView?.isHidden = articles.count != 0 || isArchiveModeEnabled
        tableView.isScrollEnabled = (introView?.isHidden)!

        DispatchQueue.main.async {
            self.tableView.reloadData()
        }
    }
}

Оцените любойhelp

ОБНОВЛЕНИЕ

Так что я решил это.Я заменил UIContextualAction (стиль: .normal, title: "") на UIContextualAction (стиль: .destructive, title: "") и больше не обновляю руководство источника данных.Завершение (true) выполняет все необходимые манипуляции с ячейкой и таблицей автоматически.

Финальный код

    func contextualMarkAsUnreadAction(forRowAtIndexPath indexPath: IndexPath) -> UIContextualAction {
    let action = UIContextualAction(style: .destructive, title: "") { _, _, completion in
        let index = indexPath.row

        if let article = self.getSelectedArticleByIndex(index) {
            self.articlesManager.restore(article: article)
            //self.refreshDataSource()
            completion(true)
        } else {
            completion(false)
        }
    }

    action.backgroundColor =  UIColor(patternImage: swipeActinImages.markAsUnread)

    return action
}
...