2015-10-05 3 views
1

Я хочу вызвать функцию, а не использовать закрытие с помощью UIAlertAction. Можно ли получить ссылку на UIAlertController, которому принадлежит UIAlertAction?Получите UIAlertController от UIAlertAction?

alert = UIAlertController(title: "City", message: "Enter a city name", preferredStyle: UIAlertControllerStyle.Alert) 
UIAlertActionStyle.Default, handler: okAlert) 

//... 

func okAlert(action: UIAlertAction) { 
    // Get to alert here from action? 
} 

ответ

3

Действие не имеет ссылки на содержащее его предупреждение. Тем не менее, это просто вопрос планирования впереди. Если вам нужно okAlert иметь ссылку на оповещения о контроллере, а затем дать это, что ссылка:

func okAlert(action: UIAlertAction, _ alert:UIAlertController) { 
    // Get to alert here? 
    // yes! it is `alert`! 
} 

Вы все еще будет нужно закрыть, чтобы захватить alert и передать его:

let alert = UIAlertController(
    title: "City", message: "Enter a city name", preferredStyle: .Alert) 
alert.addAction(UIAlertAction(title:"OK", style:.Default, handler: { 
    action in self.okAlert(action, alert) 
})) 

Там может будь то детали для разработки. Но дело в том, что если вы хотите жить в другом месте, вы можете это сделать.

0

Вы можете попробовать ниже код:

let alert = UIAlertController(title: "Test alert title", message: "Test alert body", preferredStyle: .Alert) 
alert.addAction(callback()) 
presentViewController(alert, animated: true, completion: nil) 

с callback:

func callback() -> UIAlertAction { 
    return UIAlertAction(title: "OK", style: .Default, handler: { (action) -> Void in 
     print("alert action") 
    }) 
} 

Я не знаю точно, что вы хотите. Но я думаю, вы хотите получить TextField внутри UIAlertController. Может быть, под кодом вам поможет.

var alert: UIAlertController? 
let tfTag = 123 
override func viewDidAppear(animated: Bool) { 
    super.viewDidAppear(animated) 

    if alert == nil { 
     self.alert = UIAlertController(title: "Test alert title", message: "Test alert body", preferredStyle: .Alert) 

     let action = UIAlertAction(title: "OK", style: .Default, handler: { (action) -> Void in 
      // Get your TextField 
      if let tf = self.alert!.view.viewWithTag(self.tfTag) as? UITextField { 
       print("Value: \(tf.text)") 
      } 

     }) 

     self.alert!.addAction(action) 

     // Insert UITextField 
     let textField = UITextField() 
     textField.text = "Hello World" 
     textField.tag = tfTag 
     self.alert!.view.addSubview(textField) 
     presentViewController(self.alert!, animated: true, completion: nil) 
    } 
} 

Надеюсь, что это поможет!

+1

Спасибо за ответ. Наверное, моя цель не ясна. Мне нужно добраться до текстового поля в AlertController. Я хотел бы получить это из функции callBack. Я понимаю, что могу использовать закрытие. Мне было интересно разобраться с этим без закрытия. –

0

То, что я ликвидируется делать было создать новый подкласс UIAlertAction:

public class UIAlertActionWithAlertController : UIAlertAction { 
    public weak var alertController: UIAlertController? 
} 

тогда я создаю действия, как:

let myAction = UIAlertActionWithAlertController(title: "Action", style: .default) { (action) in 
    if let alertController = (action as! UIAlertActionWithAlertController).alertController { 
     // Use alertController here 
    }} 

и в коде, который добавляет действие на сигнал тревоги у меня есть :

alertController.addAction(myAction) 
myAction.alertController = alertController