UIAlert 和视图控制器的错误

Posted

技术标签:

【中文标题】UIAlert 和视图控制器的错误【英文标题】:Bug with UIAlert and View Controller 【发布时间】:2018-11-06 11:20:12 【问题描述】:

我的 iPad 版 ios 应用中默认 Alert 有一个非常奇怪的错误。

我有三个按钮:一个用于相机,第二个用于照片库,第三个是关闭按钮。警报用于挑选照片。我遇到的问题有时是,当我单击该警报上的关闭按钮时,会执行这种类型的代码:

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)
    

如您所见,我在警报中的代码没有任何注销操作,但有时会发生这种情况。也许有人有类似的问题?这可能是什么原因?

如果您需要更多信息,请告诉我。提前感谢您的帮助!

【问题讨论】:

首先,您不需要为.cancel 类型的操作按钮编写任何代码来关闭显示的警报视图控制器。其次,您可以只使用view 来呈现警报控制器,无需询问它的父级(tabBarController)。 .cancel 按钮中的代码会关闭 Login 控制器本身。 【参考方案1】:

首先,您不需要为 .cancel 类型的操作按钮编写任何代码来关闭呈现的警报视图控制器。其次,您可以只使用视图来呈现警报控制器,而无需询问其父级(tabBarController)来执行此操作。您在 .cancel 按钮中的代码会关闭 Login 控制器本身。

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 逻辑在presenter 中 我已经对您的解决方案进行了一段时间的测试,并且该错误不再出现,所以我认为现在已经解决了。感谢您的帮助!【参考方案2】:

试试

let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)

【讨论】:

【参考方案3】:

取消当前视图控制器的 cancelAction 问题。将其样式设置为取消,无需处理程序。

let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)

【讨论】:

以上是关于UIAlert 和视图控制器的错误的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 iCarousel 更改 buttonTapped 上的视图控制器?

KeyboardWillShowNotification 和 UIAlert

Swift 使用完成处理程序将视图锁定在一个控制器中以反映在另一个控制器中

在 UIAlert 视图中显示推送通知文本

从 UINavigationController 堆栈视图呈现自定义 UIAlert

如何将另一个 ViewController 设置为 AlertView 的委托