UIViewController关闭问题

时间:2019-01-22 15:03:17

标签: ios iphone swift uiviewcontroller runloop

我想等到关闭动画结束后再执行,但是我不想在代码中使用很多块,因此我在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插入while条件,但没有用。有什么想法可以做到这一点吗?

编辑:

它可以在iOS 9或类似的系统上工作(可能需要进行一些代码更改,因为我找不到源代码)。我开始RunLoop.current.run以避免阻塞主线程。例如,如果我将completed = true放入DispatchQue.main.asyncAfter中,它将起作用,则问题出在dismiss

3 个答案:

答案 0 :(得分:1)

我再次尝试是因为我很好奇,这个解决方案实际上对我有用:

@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 |雨燕4.2

答案 1 :(得分:0)

由于您的while !completed循环已使主线程停滞并且UI更新在主线程上发生,因此无法消除。在dismiss完成闭包中运行所需的任何代码有什么问题?

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

答案 2 :(得分:0)

如果真的不使用块,也许这是一个解决方案?

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

    if self.navigationController?.isBeingDismissed ?? self.isBeingDismissed  {
        print("Dismissal completed...")
    }
}