UIViewController 关闭问题
UIViewController dismiss issue
我想等到关闭动画完成,但我不想在我的代码中使用很多块,所以我在 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
它不会关闭,因为您的 while !completed
循环已停止主线程并且 UI 更新发生在主线程上。 运行在 dismiss
完成闭包中 运行 需要的任何代码有什么问题?
self.dismiss(animated: true) {
runSomeCode()
}
如果真的只是不使用块,也许这可能是一个解决方案?
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
if self.navigationController?.isBeingDismissed ?? self.isBeingDismissed {
print("Dismissal completed...")
}
}
我又试了一次,因为我很好奇,这个解决方案对我来说确实有效:
@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 | Swift4.2
我想等到关闭动画完成,但我不想在我的代码中使用很多块,所以我在 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
它不会关闭,因为您的 while !completed
循环已停止主线程并且 UI 更新发生在主线程上。 运行在 dismiss
完成闭包中 运行 需要的任何代码有什么问题?
self.dismiss(animated: true) {
runSomeCode()
}
如果真的只是不使用块,也许这可能是一个解决方案?
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
if self.navigationController?.isBeingDismissed ?? self.isBeingDismissed {
print("Dismissal completed...")
}
}
我又试了一次,因为我很好奇,这个解决方案对我来说确实有效:
@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 | Swift4.2