swift 中的警报控制器

alertControllers in swift

我在 swift 中遇到了一些关于警报控制器的问题。我有两个用于显示 activity 指标的函数。 1 个有动画,一个没有。创建第二个没有动画的原因是……当用户单击 table 视图单元并转到新控制器时,我在视图控制器上显示 activity。此控制器调用网络服务并填充第二个 table 视图。

我的问题是 Web 服务返回响应的速度太快,以至于当我试图关闭它时 activity 指示器没有出现在屏幕上,即在 Web 服务调用的响应中。我在 viewdidload 中显示这个指标,然后在视图中调用 Web 服务函数确实加载了。

我能解决这个问题的唯一方法是创建一个没有动画的 activity 警报,因为它看起来好像动画正在减慢它的速度。但是当我将动画 属性 设置为 false 时,警报控制器没有 backgroundColor。当我尝试向警报控制器添加背景颜色时,宽度变为全屏。

所以我在寻找:

A) 一种在 Web 服务 returns 太快时关闭常规警报控制器的方法

B) 减小没有动画的第二个警报控制器的大小。

提前致谢。我在解雇这些警报控制器时遇到了很多麻烦,因为当我试图解雇它们时,我的实际视图控制器被解雇了所以我试图检查 presentedController 的 class 并且只有在 class 是 alertController 但我认为这根本不是解决它的正确方法。

代码如下:

func displayActivityAlert(title: String, #ViewController: UIViewController)
{
    let pending = UIAlertController(title: "\n\n\n"+title, message: nil, preferredStyle: .Alert)
    //create an activity indicator
    let indicator = UIActivityIndicatorView(frame: pending.view.bounds)
    indicator.autoresizingMask = .FlexibleWidth | .FlexibleHeight
    indicator.color = UIColor(rgba: Palette.accent)
    //add the activity indicator as a subview of the alert controller's view
    pending.view.addSubview(indicator)
    //pending.view.backgroundColor = UIColor.whiteColor()
    indicator.userInteractionEnabled = false // required otherwise if there buttons in the UIAlertController you will not be able to press them
    indicator.startAnimating()


    ViewController.presentViewController(pending, animated: true, completion: nil)
}

func displayActivityAlertNoAnim(title: String, #ViewController: UIViewController)
{
    let pending = UIAlertController(title: "\n\n\n"+title, message: nil, preferredStyle: .Alert)
    //create an activity indicator
    let indicator = UIActivityIndicatorView(frame: pending.view.bounds)
    indicator.autoresizingMask = .FlexibleWidth | .FlexibleHeight
    indicator.color = UIColor(rgba: Palette.accent)
    //add the activity indicator as a subview of the alert controller's view
    pending.view.addSubview(indicator)

    pending.view.backgroundColor = UIColor.whiteColor()
    // this line cause the alert controller to become full width of the screen
    indicator.userInteractionEnabled = false // required otherwise if there buttons in the UIAlertController you will not be able to press them
    indicator.startAnimating()


    ViewController.presentViewController(pending, animated: **false**, completion: nil)
}

检查class和关闭的代码:

if self.presentedViewController!.isKindOfClass(UIAlertController){
   self.dismissViewControllerAnimated(true, completion: nil)
}

您需要使用 presentViewController() 中的 completion 参数。这是一个闭包,它将在 UIAlertController 在屏幕上可见后立即执行。


现在,我只能为您提供一些伪代码,因为您没有提供有关如何下载或下载后收到的回调的任何代码,但请尝试以下操作:

func displayActivityAlert(title: String, #ViewController: UIViewController) {
    let pending = UIAlertController(title: "\n\n\n"+title, message: nil, preferredStyle: .Alert)
    ...

    ViewController.presentViewController(pending, animated: true) { () -> Void in
        // Start downloading from webservice
    }
}

并解雇:

if self.presentedViewController!.isKindOfClass(UIAlertController){
    self.dismissViewControllerAnimated(true) { () -> Void in
        // Perform segue to tableview
    }
}

更新 1:

更新了基于 OP 架构的伪代码。


如果您已将警报代码分解到一个单独的文件中,则只需将完成处理程序作为参数传入,如下所示:

func displayActivityAlert(title: String, #ViewController: UIViewController, completionHandler: ()->() ) {
    let pending = UIAlertController(title: "\n\n\n"+title, message: nil, preferredStyle: .Alert)
    ...

    self.presentViewController(pending, animated: true, completion: completionHandler)
}

然后每当您调用 displayActivityAlert 时,只需指定回调,例如:

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)
    displayActivityAlert("Hello", ViewController: self) { () -> () in
        // Download from webservice
    }
}

根据需要修改简单的代码 将此代码放在函数中或操作按钮中 将有一个按钮 "OK"

let alertView = UIAlertController(title: "Your ERROR Heading!", message: "Your error message here", preferredStyle: .Alert)
let OKAction = UIAlertAction(title: "OK", style: .Default, handler: nil)
alertView.addAction(OKAction)
self.presentViewController(alertView, animated: true, completion: nil)
class func alertController(_ title:String, message: String, okTitle: String,cancelTitle: String? = nil,cancelCompletion:(() ->Void)? = nil, okCompletion :(() -> Void)?) {
    let alertController = UIAlertController.init(title: title as String, message: message as String, preferredStyle: UIAlertControllerStyle.alert)

    let okAction = UIAlertAction.init(title: okTitle as String, style: UIAlertActionStyle.default) { (alertAction :UIAlertAction) in
        if okCompletion != nil{
            okCompletion!()
        }
    }
    alertController.addAction(okAction)

    if cancelTitle != nil && !(cancelTitle?.isEmpty)!{
        let cancelAction = UIAlertAction.init(title: cancelTitle, style: UIAlertActionStyle.cancel) { (alertAction : UIAlertAction) in
            if cancelCompletion != nil{
                cancelCompletion!()
            }
        }
        alertController.addAction(cancelAction)
    }
    Constant.Common.APPDELObj.navVC?.visibleViewController?.present(alertController, animated: true, completion: nil)


    }