Как объяснить «completionHandler (true)»

#ios #swift

#iOS #swift

Вопрос:

Я следую онлайн-руководству, касающемуся действия прокрутки ячейки TableView. Я могу объяснить себе каждую строчку, за исключением completionHandler(true)

Это фрагмент кода

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

    let deleteAction = UIContextualAction(style: .destructive, title: "Delete") { (action, sourceView, completionHandler) in
        //Delete
        self.restaurantNames.remove(at: indexPath.row)
        self.restaurantLocations.remove(at: indexPath.row)
        self.restaurantTypes.remove(at: indexPath.row)
        self.restaurantIsVisited.remove(at: indexPath.row)
        self.restaurantImages.remove(at: indexPath.row)

        self.tableView.deleteRows(at: [indexPath], with: .fade)
        // Call completion handler to dismiss the action button
        completionHandler(true)
    }

    let shareAction = UIContextualAction(style: .normal, title: "Share") { (action, sourceView, completionHandler) in
        let defaultText = "Just checking in at"   self.restaurantNames[indexPath.row]
        let activityController = UIActivityViewController(activityItems: [defaultText], applicationActivities: nil)
        self.present(activityController, animated: true, completion: nil)
        // Call completion handler to dismiss the action button
        completionHandler(true)
    }

    let swipeConfiguration = UISwipeActionsConfiguration(actions: [deleteAction, shareAction])

    return swipeConfiguration
}
  

Я не совсем понимаю, что это значит?
Заранее спасибо

Ответ №1:

Все существующие ответы просто вставляют документацию Apple, которая точно ни на что не отвечает. В нем указано, когда его следует вызвать, но ничего о том, что он делает с пользовательским интерфейсом.

Насколько я могу судить, вызов completionHandler с любым значением приведет к свертыванию кнопок. Вы можете увидеть это в действии, вызвав обработчик завершения в dispatch_after блоке с задержкой. Указание true или false не имеет значения в моих тестах.

У меня такое чувство, что я чего-то не понимаю, но документация Apple здесь непрозрачна.

Ответ №2:

Объяснение: Вы вызываете обработчик завершения с помощью true, чтобы указать, что вы выполнили действие, или false, если вы не смогли по какой-либо причине.

Проверьте работу демонстрационного кода ниже:

 func contextualToggleFlagAction(forRowAtIndexPath indexPath: IndexPath) -> UIContextualAction {

    var email = data[indexPath.row]

    let action = UIContextualAction(style: .normal,
                                    title: "Flag") { (contextAction: UIContextualAction, sourceView: UIView, completionHandler: (Bool) -> Void) in

        if email.toggleFlaggedFlag() {

            self.data[indexPath.row] = email
            self.tableView.reloadRows(at: [indexPath], with: .none)

            completionHandler(true) // your task is successfully done.
        } else {

            completionHandler(false) // With some reason you unable to perform task so now you returning false.
        }
    }

    action.image = UIImage(named: "flag")
    action.backgroundColor = email.isFlagged ? UIColor.gray : UIColor.orange
    return action
}
  

Ответ №3:

Третий параметр UIContextualAction обработчика — это закрытие, которое сообщает, UIContextualAction выполнили ли вы действие или нет. Звоня, completionHanlder(true) вы уведомляете UIContextualAction , что выполнили запрошенное действие. Если, например, в вашем обработчике произошла ошибка, которая помешала вам выполнить желаемое действие, вы можете уведомить обработчик, вызвав completionHandler(false) .

Документация:https://developer.apple.com/documentation/uikit/uicontextualaction/handler

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

1. … который по-прежнему не объясняет, что это различие ДЕЛАЕТ с пользовательским интерфейсом.

Ответ №4:

На самом деле комментарий перед completionHandler строкой объясняет цель. Обработчик завершения — это закрытие, которое должно быть вызвано в конце действия, чтобы отменить действие и передать значение статуса.

Дополнительная информация из документации

Обработчик завершения

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

actionPerformed

Логическое значение, указывающее, выполнили ли вы действие. Укажите, true выполняли ли вы действие или false если вы не смогли выполнить действие по какой-либо причине.