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)
}
我在 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)
}