objective example ios uialertview uialertcontroller

ios - example - uialertcontroller swift 4



¿Cómo descartar UIAlertController cuando se toca fuera de UIAlertController? (10)

Swift, Xcode 9

Descartar AlertController con el botón de cancelar

proporcione acción a su alertController donde el estilo de .cancel es .cancel

var alertVC = UIAlertController(...) // initialize your Alert View Controller alertVC.addAction(UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Cancel, handler: { (alertAction: UIAlertAction!) in alertVC.dismissViewControllerAnimated(true, completion: nil) }))

El uso de este método alertController se descartará cuando el usuario toque para cancelar el botón de acción, así como fuera del alertController.

Si no desea que el usuario descarte alertController después de un retoque fuera de alertController, desactive la interacción del usuario de las primeras subvistas de alertController para completar el cierre del método actual.

UIAlertController *alertController = [UIAlertController alertControllerWithTitle:...]; [alertController addAction:[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) { [alertVC dismissViewControllerAnimated:YES completion:nil]; }]];

Descartar AlertController en retoque fuera de la vista Controlador

Si no desea el botón de cancelar en la vista de su controlador y desea descartar el controlador cuando el usuario toque el botón de fuera de la vista del controlador, hágalo

let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil) alertController.addAction(cancelAction)

¿Cómo descartar UIAlertController cuando se toca fuera de UIAlertController ?

Puedo agregar una UIAlertAction del estilo UIAlertActionStyleCancel para descartar el UIAlertController .

Pero quiero agregar la función que cuando el usuario toque fuera del UIAlertController el UIAlertController se UIAlertController . ¿Como hacer eso? Gracias.


Agregue una acción de cancelación separada con estilo UIAlertActionStyleCancel . Para que cuando el usuario toque fuera, obtendría la devolución de llamada.

UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Alert Title" message:@"A Message" preferredStyle:UIAlertControllerStyleActionSheet]; [alertController addAction:[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) { // Called when user taps outside }]];

-


La forma más fácil en Obj-C:

- (void)alertControllerBackgroundTapped { [self dismissViewControllerAnimated: YES completion: nil]; }

y entonces:

[presenter presentViewController:alertController animated:YES completion:^{ NSArray <UIView *>* superviewSubviews = alertController.view.superview.subviews; for (UIView *subview in superviewSubviews) { if (CGRectEqualToRect(subview.bounds, weakSelf.view.bounds)) { [subview addSingleTapGestureWithTarget:weakSelf action:@selector(dismissModalTestViewController)]; } } }];


La forma más simple:

UIAlertController *alert = [UIAlertController alertControllerWithTitle: ... [self presentViewController:alert animated:YES completion:^{ [alert.view.superview addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(alertControllerBackgroundTapped)]]; }];


Si está usando swift y preferredStyle es Alert , puede usar el fragmento de código de la siguiente manera:

func showAlertBtnClicked(sender: UIButton) { let alert = UIAlertController(title: "This is title", message: "This is message", preferredStyle: .Alert) self.presentViewController(alert, animated: true, completion:{ alert.view.superview?.userInteractionEnabled = true alert.view.superview?.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.alertControllerBackgroundTapped))) }) } func alertControllerBackgroundTapped() { self.dismissViewControllerAnimated(true, completion: nil) }

Con Swift 3:

func showAlertBtnClicked(sender: UIButton) { let alert = UIAlertController(title: "This is title", message: "This is message", preferredStyle: .alert) self.present(alert, animated: true) { alert.view.superview?.isUserInteractionEnabled = true alert.view.superview?.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.alertControllerBackgroundTapped))) } } func alertControllerBackgroundTapped() { self.dismiss(animated: true, completion: nil) }


Si está utilizando Swift :

Agregue una acción con addAction(_:) y style:UIAlertActionStyle.Cancel .

Se llamará al controlador `cuando toque el botón o fuera del marco.

self.present(alertController, animated: true) { alertController.view.superview?.subviews[0].isUserInteractionEnabled = false }

Objective-C :

self.present(alertController, animated: true) { let tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.dismissAlertController)) alertController.view.superview?.subviews[0].addGestureRecognizer(tapGesture) } } @objc func dismissAlertController(){ self.dismiss(animated: true, completion: nil) }


Si ve depurar la vista de supervisión de la alerta, no es tan simple como agregar un reconocedor de gestos de toque al UITransitionView del _UIAlertControllerView. Puede hacer esto en su lugar

- (void)addBackgroundDismissTapForAlert:(UIAlertController *)alert { if (!alert.view.superview) { return; } alert.view.superview.userInteractionEnabled = YES; [alert.view.superview addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget: self action: @selector(alertControllerBackgroundTapped)]]; for (UIView *subV in alert.view.superview.subviews) { if (subV.width && subV.height) { subV.userInteractionEnabled = YES; [subV addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget: self action: @selector(alertControllerBackgroundTapped)]]; } } } - (void)alertControllerBackgroundTapped { [self dismissViewControllerAnimated: YES completion: nil]; }


Swift 4:

Descartar hoja de acción cuando el usuario toca fuera de la hoja de acción creada con UIAlertController

Fragmento de código:

UIView *alertView = self.alertController.view; UIView *superPuperView = self.alertController.view.superview; CGPoint tapCoord = [tap locationInView:superPuperView]; if (!CGRectContainsPoint(alertView.frame, tapCoord)) { //dismiss alert view }


- (void)viewDidLoad { [super viewDidLoad]; [self button]; } - (void) button { UIButton * AlertButton = [UIButton buttonWithType:UIButtonTypeSystem]; [AlertButton setTitle:@"Button" forState:UIControlStateNormal]; AlertButton.frame = CGRectMake((self.view.frame.size.width/2) - 50 , (self.view.frame.size.height/2) - 25, 100, 50); [AlertButton addTarget:self action:@selector(Alert) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:AlertButton]; } - (void)Alert { UIAlertController * alert = [UIAlertController alertControllerWithTitle:@"Alert Title" message:@"Alert Message" preferredStyle:UIAlertControllerStyleAlert]; [self presentViewController: alert animated: YES completion:^{ alert.view.superview.userInteractionEnabled = YES; [alert.view.superview addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget: self action: @selector(DismissAlertByTab)]]; }]; } - (void)DismissAlertByTab { [self dismissViewControllerAnimated: YES completion: nil]; }


// Declare Action Sheet reference var actionSheet: UIAlertController! // Init and Show Action Sheet func showActionSheetClicked(sender: UIButton) { // Init Action Sheet actionSheet = UIAlertController(title: "Title", message: "Message", preferredStyle: .actionSheet) self.present(actionSheet, animated: true) { // Enabling Interaction for Transperent Full Screen Overlay self.actionSheet.view.superview?.subviews.first?.isUserInteractionEnabled = true // Adding Tap Gesture to Overlay self.actionSheet.view.superview?.subviews.first?.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.actionSheetBackgroundTapped))) } } // To dismiss Action Sheet on Tap @objc func actionSheetBackgroundTapped() { self.actionSheet.dismiss(animated: true, completion: nil) }