我厌倦了宣布整个班级都有能力处理UIAlertView
通过使它们延伸来点击UIAlertViewDelegate
。当我有多种可能时,它开始感觉混乱和错误UIAlertView
s,并且必须区分在处理程序中单击了哪个。
我真正想要的是创建一个实现UIAlertViewDelegate
协议,并将这个一次性对象交给我的UIAlertView
当展示它的时候。
我想要这样的东西:
let confirmDelegate = UIAlertViewDelegate() {
func alertView(alertView: UIAlertView!, clickedButtonAtIndex buttonIndex: Int) {
// Handle the click for my alertView
}
}
然后在显示警报时使用它:
let alertView = UIAlertView(title: "Confirm", message: "Are you sure?", delegate: confirmDelegate, cancelButtonTitle: "No", otherButtonTitles: "Yes")
alertView.show()
这可以在不声明新类的情况下实现吗?
我知道我可以做这样的事情:
class ConfirmDelegate: UIAlertViewDelegate {
func alertView(alertView: UIAlertView!, clickedButtonAtIndex buttonIndex: Int) {
// ...
}
}
然后实例化一个ConfirmDelegate()
,但我只是想知道这是否可以作为单行类声明和实例化。
正如 @ChrisWagner 在他的评论中所说,你不需要在 iOS8 中执行任何此操作,至少对于UIAlertView
因为有一个新的UIAlertViewController
使用闭包而无需任何委托。但从学术角度来看,这种模式还是很有趣的。
我根本不会使用匿名类。我只想创建一个可以指定为委托的类,并接受闭包以在发生某些情况时执行。
您甚至可以升级它以接受每种操作的关闭:onDismiss
, onCancel
等等。或者您甚至可以使此类生成警报视图,将其自身设置为委托。
import UIKit
class AlertViewHandler: NSObject, UIAlertViewDelegate {
typealias ButtonCallback = (buttonIndex: Int)->()
var onClick: ButtonCallback?
init(onClick: ButtonCallback?) {
super.init()
self.onClick = onClick
}
func alertView(alertView: UIAlertView!, clickedButtonAtIndex buttonIndex: Int) {
onClick?(buttonIndex: buttonIndex)
}
}
class ViewController: UIViewController {
// apparently, UIAlertView does NOT retain it's delegate.
// So we have to keep it around with this instance var
// It'll be nice when all of UIKit is properly Swift-ified :(
var alertHandler: AlertViewHandler?
func doSoemthing() {
alertHandler = AlertViewHandler({ (clickedIndex: Int) in
println("clicked button \(clickedIndex)")
})
let alertView = UIAlertView(
title: "Test",
message: "OK",
delegate: alertHandler!,
cancelButtonTitle: "Cancel"
)
}
}
传递闭包should减轻对匿名类的需求。至少对于最常见的情况是这样。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)