#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
если вы не смогли выполнить действие по какой-либо причине.