2015-05-25 5 views
1

Все Я реализую расширение UIAlertView для реализации обратного вызова, например UIAlertView + Block в Objective C, но метод делегата не вызывает из этого класса никакой помощи. Спасибо заранее.Вызов метода делегата из класса расширения Swift

+0

Можете ли вы разместить свой код здесь. – tounaobun

ответ

0

Обратный вызов от тревоги взгляда работает в фоновом потоке и код его получение, вероятно, работает в основном потоке, согласно яблочной документации:

От компании Apple iOS Documentation on Notification Centers:

В многопоточное приложение, уведомления всегда отправляются в поток, в котором было отправлено уведомление, которое может быть не того же потока, в котором наблюдатель зарегистрировал себя.

Вам необходимо позвонить уведомление обратно в основной поток в противном случае могут происходить странные вещи

dispatch_async(dispatch_get_main_queue(), { 
    //Call your notification from here 
    NSNotificationCenter.defaultCenter().postNotificationName(mySpecialNotificationKey, object: self) 
}) 
+0

Спасибо, IcaroNZ, но мой метод делегата не называется как сказано. –

+0

@GopalDevra вы можете разместить свой код, чтобы мы помогли вам его просмотреть? – Icaro

1

Это обновленный ответ после решения этого вопроса.

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") 
     } 
    } 
} 
+1

Ваш класс уже является UIAlertView, и вы создаете еще один UIAlertView, вы должны изменить все alertView для себя. Это должно решить вашу проблему. – Icaro

+0

Хорошо, я собираюсь проверить. –

+0

Большое спасибо IcaroNZ, он работает хорошо. –

Смежные вопросы