所有 我正在实现一个UIAlertView扩展用于回调实现,比如Objective C中的UIAlertView + Block,但委托方法不是从这个类调用任何帮助。 提前致谢。
答案 0 :(得分:0)
来自警报视图的回调在后台线程中运行,接收它的代码可能正在主线程中运行,根据苹果文档:
来自Apple iOS Documentation on Notification Centers:
在多线程应用程序中,始终会传递通知 发布通知的线程,可能不是 观察者注册的同一个线程。
您需要在主线程中回调通知,否则会发生奇怪的事情
dispatch_async(dispatch_get_main_queue(), {
//Call your notification from here
NSNotificationCenter.defaultCenter().postNotificationName(mySpecialNotificationKey, object: self)
})
答案 1 :(得分:0)
这是解决问题后的更新答案。
typealias SelectBlock = (buttonIndex : Int) -> Void
typealias CancelBlock = () -> Void
private var blockSelect : SelectBlock?
private var blockCancel : CancelBlock?
extension UIAlertView {
//Initilization
func initWithTitle(
title : String ,
message : String,
onSelect : SelectBlock?,
onCancel : CancelBlock?,
otherButtonTitles : [String]){
//Initialize
self.title = title
self.delegate = self
self.message = message
//Block
if let onSelectObj = onSelect? {
blockSelect = onSelectObj
}
if let onCancelObj = onCancel? {
blockCancel = onCancelObj
}
//Other buttons
for buttons in otherButtonTitles {
self.addButtonWithTitle(buttons)
}
//Cancel index
// println("buttons \(self.numberOfButtons)")
self.cancelButtonIndex = 0
self.show()
}
func alertView(alertView: UIAlertView, didDismissWithButtonIndex buttonIndex: Int) {
println("Index \(buttonIndex)")
if buttonIndex == alertView.cancelButtonIndex {
blockCancel!()
// println("Cancel")
}else{
blockSelect!(buttonIndex: buttonIndex)
// println("Retry")
}
}
}