UIViewController закрывает вопрос - PullRequest
0 голосов
/ 22 января 2019

Я хочу подождать, пока анимация завершения не завершится, но я не хочу использовать много блоков в своем коде, поэтому я написал эту функцию в 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 в то время, пока условие не сработало. Есть идеи как это сделать?

Edit:

И это работало на iOS 9 или что-то вроде этого (может быть, с некоторыми изменениями кода, потому что я не могу найти свой исходный код). Я запускаю RunLoop.current.run, чтобы избежать блокировки основного потока. Например, если я добавлю completed = true в DispatchQue.main.asyncAfter, он будет работать, проблема с dismiss

Ответы [ 3 ]

0 голосов
/ 22 января 2019

Если на самом деле речь идет не об использовании блоков, может быть, это может быть решением?

override func viewDidDisappear(_ animated: Bool) {
    super.viewDidDisappear(animated)

    if self.navigationController?.isBeingDismissed ?? self.isBeingDismissed  {
        print("Dismissal completed...")
    }
}
0 голосов
/ 23 января 2019

Я попробовал еще раз, потому что мне было любопытно, и это решение действительно работает для меня:

@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

0 голосов
/ 22 января 2019

Он не отклоняется, потому что ваш цикл while !completed остановил основной поток, а обновление основного интерфейса происходит в основном потоке. Что не так с запуском любого кода, который вам нужен для запуска в закрытии завершения dismiss?

self.dismiss(animated: true) {
    runSomeCode()
}
...