UINavigationBarDelegate를 구현하려고하는데 사용자가이 뷰를 벗어날 지 여부를 결정할 수 있도록 경고를 표시하려고합니다. 나는 결과를 반환해야합니다UIAlertController의 결과를 동기화하는 방법은 무엇입니까?
extension CDFFormController: UINavigationBarDelegate {
public func navigationBar(_ navigationBar: UINavigationBar, shouldPop item: UINavigationItem) -> Bool {
if let entityViewController = self.topViewController as? MyEntityViewController {
if entityViewController.isEditing {
let semaphore = DispatchSemaphore(value: 0)
var result = false
let alert = UIAlertController(title: "Leave the view?", message: nil, preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "leave", style: .default, handler: { _ in
result = true
semaphore.signal()
}))
alert.addAction(UIAlertAction(title: "cancel", style: .cancel, handler: { _ in
semaphore.signal()
}))
entityViewController.present(alert, animated: true, completion: nil)
semaphore.wait()
return result
} else {
return true
}
} else {
return true
}
}
}
, 그래서 나는 방법을 차단하는 DispatchSemaphore를 사용
이 내 코드입니다. 하지만 질문입니다 :이 방법은 메인 대기열에서 호출되며 그것을 차단하는 것은 UI 스레드를 차단한다는 것을 의미합니다.
또는 다른 해결책이 있습니까?
'UIAlertController'의 .isBeingPresented가 귀하의 경우에 유용 할 수도 있습니다. 내 workaround 솔루션에서 사용한 : http://stackoverflow.com/a/43507005/5329717 다른 문제에 대한, 아마도 당신은 어떤 식 으로든 도움이 될 것입니다. –
완료 핸들러를 대신 사용하십시오. – Sulthan
이 델리게이트 메소드가 주 스레드 (UI 스레드)에서 호출되면 경고 컨트롤러 이벤트는 반환 될 때까지 표시 될 수 없습니다! –