Я хотел бы показать индикатор загрузки, когда пользователь проводит ячейку вправо, что вызывает асинхронное действие. Пока это действие продолжается, я хотел бы скрыть метку внутри, оставить ячейку «встроенной», а не «повторной прокруткой» и показать уже упомянутый индикатор.
Это то, что я получил до сих пор, и это уже частично работает:
override func tableView(_ tableView: UITableView, leadingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
let action = UIContextualAction(style: .normal, title: "My Action") { (action, view, handler: @escaping (Bool) -> Void) in
// Getting UIButtonLabel, which is a subclass of UILabel
guard let label = view as? UILabel else {
return
}
// Not used right now
guard let superView = label.superview else {
return
}
// Try to hide the existing label
label.text = "" // Doesn't work
label.attributedText = nil // Doesn't work
label.textColor = UIColor.clear // Doesn't work
// Add a loading indicator at the position of the label, works!
let loadingIndicator = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.white)
loadingIndicator.translatesAutoresizingMaskIntoConstraints = false
loadingIndicator.startAnimating()
label.addSubview(loadingIndicator)
NSLayoutConstraint.activate([
loadingIndicator.centerXAnchor.constraint(equalTo: label.centerXAnchor),
loadingIndicator.centerYAnchor.constraint(equalTo: label.centerYAnchor),
loadingIndicator.heightAnchor.constraint(equalTo: label.heightAnchor, multiplier: 0.8),
loadingIndicator.widthAnchor.constraint(equalTo: loadingIndicator.heightAnchor)
])
self.viewModel.doAsyncAction(completionHandler: { (success) in
loadingIndicator.stopAnimating()
loadingIndicator.removeFromSuperview()
handler(true)
})))
}
action.backgroundColor = .darkGray
return UISwipeActionsConfiguration(actions:[action])
}
Я могу добавить индикатор загрузки в правильном положении. Я до сих пор не могу скрыть ярлык. Удаление его или настроек его альфа или скрытого состояния не будет работать, так как индикатор загрузки должен быть его подвидом (для внутреннего позиционирования UITableView).
Кроме того, я могу помешать пользователю снова выполнить действие, вызвав обработчик обратного вызова с опозданием, но я не могу заставить ячейку сохраняться в этой позиции "одноуровневого встраивания". Это особенно уродливо, когда пользователь не проводит пальцем по ячейке и не нажимает кнопку, но решает провести по ячейке, чтобы вызвать действие. В этом случае я бы хотел, чтобы ячейка автоматически переместилась в положение «на один уровень».
Кто-нибудь знает хитрость для этого? Я видел это уже в некоторых приложениях. Есть ли общее дополнение UIKit для такого рода вещей?