Я пытаюсь реализовать UINavigationBarDelegate и хочу показать предупреждение, чтобы пользователь мог определить, следует ли покинуть это представление.
Это мой код:
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 для блокировки метода. Но вопрос в том, что этот метод вызывается в основной очереди, и его блокировка означает блокировку потока пользовательского интерфейса, и метод никогда не возвращается.
Или любое другое решение?
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Cannot manually set the delegate on a UINavigationBar managed by a controller.'
, iOS не хочет, чтобы я менял делегата, но это хороший момент. Я думаю, что могу использовать новое свойство флага, чтобы делать то же самое :) 24.04.2017*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Cannot call popNavigationItemAnimated: directly on a UINavigationBar managed by a controller.'
. Но я не хочу сам управлять UINavigationBar :( 24.04.2017