UIViewController закрывает вопрос

Я хочу дождаться завершения анимации отклонения, но не хочу использовать много блоков в своем коде, поэтому я написал эту функцию в UIViewControllerextension (почти как это работало несколько лет назад для меня):

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...")
    }
}
Другие вопросы по тегам