У меня очень странная ошибка с Alert по умолчанию в моем приложении iOS для iPad.
На нем у меня есть три кнопки: одна для камеры, вторая для фотогалереи и третья кнопка закрытия. Оповещение используется для выбора фотографий. Проблема, с которой я сталкиваюсь, иногда заключается в том, что когда я нажимаю кнопку отклонения в этом предупреждении, выполняется этот тип кода:
let loginVC = self.storyboard?.instantiateViewController(withIdentifier: "LoginViewController") as! LoginPageViewController
Я не уверен, что это именно тот код, который выполняется, но он выполняет действие выхода, и пользователи перенаправляются на экран входа в систему.
Вот мой код для Alert
func showPopover(uiView: UIView) {
let alertController = UIAlertController(title: nil, message: "Choose Photos", preferredStyle: .actionSheet)
let defaultAction = UIAlertAction(title: "Camera", style: .default, handler: { (alert: UIAlertAction!) -> Void in
self.view?.pickPhotoFromCamera()
})
let galleryAction = UIAlertAction(title: "Gallery", style: .default, handler: { (alert: UIAlertAction!) -> Void in
self.view?.pickPhotoFromLibrary()
})
let cancelAction = UIAlertAction(title: "Cancel", style: .destructive, handler: { (alert: UIAlertAction!) -> Void in
(self.view as? UIViewController)?.dismiss(animated: true, completion: nil)
})
alertController.addAction(defaultAction)
alertController.addAction(galleryAction)
alertController.addAction(cancelAction)
if let popoverController = alertController.popoverPresentationController {
popoverController.sourceView = uiView
popoverController.sourceRect = CGRect(x: uiView.bounds.midX, y: uiView.bounds.midY, width: 0, height: 0)
popoverController.permittedArrowDirections = []
}
(view as? UIViewController)?.tabBarController!.present(alertController, animated: true, completion: nil)
}
Как видите, мой код в предупреждении не имеет действий для выхода, но иногда такое случается. Может у кого были похожие проблемы? Что могло быть причиной этого?
Если вам нужна дополнительная информация - дайте мне знать. Заранее спасибо за помощь!





пытаться
let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)
Проблема в cancelAction, которая закрывает текущий контроллер представления. установить его стиль на отмену без обработчика.
let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)
Во-первых, вам не нужно писать какой-либо код для кнопки действия типа .cancel, чтобы закрыть представленный контроллер представления предупреждений. Во-вторых, вы можете просто использовать представление для представления контроллера предупреждений, не нужно просить его родительский (tabBarController) сделать это. Ваш код в кнопке .cancel отклоняет сам контроллер входа в систему.
import UIKit
class LoginViewController: UIViewController {
func showPopover(uiView: UIView) {
let alertController = UIAlertController(title: nil, message: "Choose Photos", preferredStyle: .actionSheet)
let defaultAction = UIAlertAction(title: "Camera", style: .default, handler: { (alert: UIAlertAction!) -> Void in
self.pickPhotoFromCamera()
})
let galleryAction = UIAlertAction(title: "Gallery", style: .default, handler: { (alert: UIAlertAction!) -> Void in
self.pickPhotoFromLibrary()
})
let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)
alertController.addAction(defaultAction)
alertController.addAction(galleryAction)
alertController.addAction(cancelAction)
if let popoverController = alertController.popoverPresentationController {
popoverController.sourceView = uiView
popoverController.sourceRect = uiView.bounds
}
present(alertController, animated: true, completion: nil)
}
private func pickPhotoFromCamera() { }
private func pickPhotoFromLibrary() { }
}
Спасибо за предложение. Я попробую посмотреть, как это работает. Причина, по которой я использую (view as? UIViewController)?.tabBarController!.present(alertController, animated: true, completion: nil), заключается в том, что я использую VIPER в своем приложении, и эта логика Alert находится в презентаторе.
Я тестировал ваше решение в течение некоторого времени, и ошибка больше не появлялась, поэтому я думаю, что теперь она решена. Спасибо за твою помощь!
Во-первых, вам не нужно писать какой-либо код для кнопки действия типа
.cancel, чтобы закрыть представленный контроллер представления предупреждений. Во-вторых, вы можете просто использоватьviewдля представления контроллера предупреждений, не нужно просить его родитель (tabBarController) сделать это. Ваш код в кнопке.cancelотклоняет сам контроллер входа в систему.