ios - objective - Método simple delegado de la aplicación para mostrar un UIAlertController(en Swift)
uialertcontroller swift 4 (5)
Desde el interior del delegado de la aplicación.
window.rootViweController.presentViewController..
En obj-C, cuando otra aplicación de iOS (archivo adjunto de correo electrónico, enlace web) se seleccionó con un archivo o vínculo asociado a mi aplicación. Me gustaría ver esto en openURL o didFinishLaunchingWithOptions
y mostrar un UIAlertView
para confirmar que el usuario quiere importar los datos. Ahora que UIAlertView
está depreciado, trato de hacer lo mismo pero no estoy seguro de cuál es la mejor manera de hacerlo.
Tengo problemas para mostrar una alerta simple cuando mi aplicación recibe datos de otra aplicación. Este código funcionó bien en Objective-C con un UIAlertView
:
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
if (url)
{
self.URLString = [url absoluteString];
NSString *message = @"Received a data exchange request. Would you like to import it?";
importAlert = [[UIAlertView alloc] initWithTitle:@"Data Received" message:message delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"OK", nil];
[importAlert show];
}
return YES;
}
Pero cuando trato de cambiar a UIAlertViewController
y Swift, parece que no puedo encontrar una forma sencilla de mostrar el mensaje:
func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject?) -> Bool {
let URLString: String = url.absoluteString!
let message: String = "Received data. Would you like to import it?"
var importAlert: UIAlertController = UIAlertController(title: "Data Received", message: message, preferredStyle: UIAlertControllerStyle.Alert)
importAlert.addAction(UIAlertAction(title: "Cancel", style: .Cancel, handler: nil))
importAlert.addAction(UIAlertAction(title: "Ok", style: .Default, handler:
{ action in
switch action.style {
case .Default:
println("default")
case .Cancel:
println("cancel")
case .Destructive:
println("destructive")
}
}))
self.presentViewController(importAlert, animated: true, completion: nil)
return true
}
presentViewController
un error de tiempo de compilación en el que AppDelegate
no tiene un miembro llamado presentViewController
He visto algunos métodos intrincados para hacer que AppDelegate
muestre un UIAlertViewController
en StackOverflow, pero esperaba que hubiera algo un poco más simple.
Todo lo que realmente necesito hacer es mostrarle al usuario un mensaje rápido de que obtuvieron algunos datos y hacer que decidan qué quieren hacer con él. Una vez hecho esto, mi aplicación continuará abriéndose y vendrá a primer plano (código similar en didFinishLaunchingWithOptions
para inicio en frío) con los nuevos datos agregados o no basados en la selección de alertas.
Podría marcar una variable global que viewWillAppear
en todas las viewWillAppear
mi viewWillAppear
pero esto sería una gran cantidad de duplicaciones, ya que tengo más de 30 visualizaciones.
Avísame si tienes alguna idea.
Gracias
Greg
Intenta usar
self.window?.rootViewController?.presentViewController(importAlert, animated: true, completion: nil)
Todo lo que necesita es un objeto viewController
para presentar AlertController.
En Swift 4:
self.window?.rootViewController?.present(importAlert, animated: true, completion: nil)
La mejor forma que he encontrado es la siguiente:
let importantAlert: UIAlertController = UIAlertController(title: "Action Sheet", message: "Hello I was presented from appdelegate ;)", preferredStyle: .ActionSheet) //.Alert .ActionSheet
var hostVC = UIApplication.sharedApplication().keyWindow?.rootViewController
while let next = hostVC?.presentedViewController {
hostVC = next
}
hostVC?.presentViewController(importantAlert, animated: true, completion: nil)
let delay = 1.5 * Double(NSEC_PER_SEC)
let time = dispatch_time(DISPATCH_TIME_NOW, Int64(delay))
dispatch_after(time, dispatch_get_main_queue()) {
importantAlert.dismissViewControllerAnimated(true, completion: nil)
return
}
He agregado un temporizador para que el UIAlertController se cierre porque no tiene botones.
Gracias a: https://.com/a/33128884/6144027 Brillante respuesta sobre cómo presentar un UIAlertController de AppDelegate.
La respuesta aceptada en Swift 3 en caso de que ayude a alguien:
self.window?.rootViewController?.present(importAlert, animated: true, completion: nil)
Utilice este código para iniciar alertCV desde el appdelegate
dispatch_async(dispatch_get_main_queue(), {
let importantAlert: UIAlertController = UIAlertController(title: "Action Sheet", message: "Hello I was presented from appdelegate ;)", preferredStyle: .ActionSheet)
self.window?.rootViewController?.presentViewController(importantAlert, animated: true, completion: nil)
})
¡Espero que esto ayude!