从Swift的Extension类调用委托方法

时间:2015-05-25 05:01:51

标签: swift objective-c-category swift-extensions

所有 我正在实现一个UIAlertView扩展用于回调实现,比如Objective C中的UIAlertView + Block,但委托方法不是从这个类调用任何帮助。 提前致谢。

2 个答案:

答案 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")
        }
    }
}