UIViewController закрывает вопрос
Я хочу дождаться завершения анимации отклонения, но не хочу использовать много блоков в своем коде, поэтому я написал эту функцию в UIViewController
extension
(почти как это работало несколько лет назад для меня):
func dismissAnimated() {
var comleted: Bool = false
self.dismiss(animated: true) {
comleted = true
}
while !comleted {
RunLoop.current.run(mode: RunLoop.Mode.common, before: Date.distantFuture)
}
}
так что теперь вместо:
viewController.dismiss(animated: true) {
// code after completion
}
Я должен был написать:
viewController.dismissAnimated()
// code after completion
Но он не закрывает контроллер представления и не входит в блок завершения.
Я пробовал разные режимы RunLoop, пробовал разные даты, пытался вставить RunLoop.current.run в то время, пока условие не сработало. Есть идеи, как это сделать?
Редактировать:
И это работало на iOS 9 или что-то вроде этого (может быть, с некоторыми изменениями кода, потому что я не могу найти свой исходный код). я начинаю RunLoop.current.run
чтобы избежать блокировки основного потока. Например, если я поставлю completed = true
в DispatchQue.main.asyncAfter, он будет работать, проблема с dismiss
3 ответа
Я попробовал еще раз, потому что мне было любопытно, и это решение действительно работает для меня:
@objc private func dismissTapped() {
let dismissalTime = dismissAnimated()
print("Dismissal took: %ld", abs(dismissalTime))
}
private func dismissAnimated() -> TimeInterval {
let startDate = Date()
var completed = false
self.dismiss(animated: true) {
completed = true
}
while !completed {
RunLoop.current.run(mode: .default, before: .distantFuture)
}
return startDate.timeIntervalSinceNow
}
iOS 12.1.2 | Swift 4.2
Это не увольняет, потому что ваш while !completed
Цикл остановил основной поток, и обновление основного интерфейса происходит в основном потоке. Что плохого в запуске любого кода, который вам нужен для запуска внутри dismiss
завершение закрытия?
self.dismiss(animated: true) {
runSomeCode()
}
Если это на самом деле просто не использовать блоки, может быть, это может быть решением?
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
if self.navigationController?.isBeingDismissed ?? self.isBeingDismissed {
print("Dismissal completed...")
}
}