为了稍微管理/缩短我的代码,我决定尝试创建一个帮助程序类来管理所有警报。
这个想法是帮助程序类将创建警报。当用户按下按钮时,它将发送回调以通知viewController上的代码按下哪个按钮。然后基于此我可以发出不同的代码。
目前我已经设法正确弹出警报的代码,但是当按下按钮时我无法发送回调。
这是我迄今为止创建的警报管理器(为简单起见仍然是基本的):
var alertMgr: alertManager = alertManager()
class alertManager: NSObject {
func showAlert(titleText:String?, confirmText:String, cancelText:String, msgText:String, showCancel:Bool, showConfirm:Bool, style:UIAlertControllerStyle, viewController:UIViewController) -> Int? {
let alertController = UIAlertController(title: titleText, message: msgText, preferredStyle: style)
var myInt:Int!
let actionLeft = UIAlertAction(title:cancelText, style: .Cancel) { action in
println("0") //works when user presses cancel button
myInt = 0
}
let actionRight = UIAlertAction(title:confirmText, style: .Default) { action in
println("1") //works when user presses confirm button
myInt = 1
}
alertController.addAction(actionLeft)
alertController.addAction(actionRight)
viewController.presentViewController(alertController, animated: true, completion: nil)
return myInt //does not return when button is pressed???
}
}
在我想要显示警报的代码中,我使用以下代码:
let titleTxt:String = "title txt goes here."
let confirmTxt:String = "confirm"
let cancelTxt:String = "cancel"
let msgTxt:String = "some msg goes here."
let showCancel:Bool = true
let showConfirm:Bool = true
let style:UIAlertControllerStyle = .ActionSheet
let alert = alertMgr.showAlert(titleTxt, confirmText: confirmTxt, cancelText: cancelTxt, msgText: msgTxt, showCancel: showCancel, showConfirm: showConfirm, style:style, viewController: self)
switch alert as Int! {
case nil:
println("nil value")
case 0:
println("cancel pressed") //never gets fired. when button is pressed
case 1:
println("confirm pressed") //never gets fired. when button is pressed
default:
break
}
主要问题是我似乎无法通过回按钮按下按钮发送“myInt”值。我已经通过[UIAlertController]在这里搜索了几乎所有的问题,并且无法找到任何能够推动我朝着正确方向前进的提示。
任何帮助都会很棒。
答案 0 :(得分:2)
showAlert
在任何给定的块有机会被执行之前返回myInt
的值,解决方案是将完整的动作块作为showAlert
的参数传递。为了缩短签名,您可以使用text,block和flag值准备一个特殊类型,并使该函数处理此类对象的数组。