2015-05-06 4 views
24

Wie UIAlertController zu entlassen, wenn tippen Sie außerhalb der UIAlertController?Wie kann man UIAlertController ablehnen, wenn man außerhalb des UIAlertControllers tippt?

Ich kann eine UIAlertAction des Stils UIAlertActionStyleCancel hinzufügen, um die UIAlertController zu entlassen.

Aber ich möchte die Funktion hinzufügen, die, wenn Benutzer tippen außerhalb UIAlertController die UIAlertController wird entlassen. Wie geht das? Vielen Dank.

+2

Hallo Leizh00701 check this out http://stackoverflow.com/questions/25466718/uialertcontroller-handle-dismiss-upon-click-outside-ipad – Harish

+0

, was die Absender ist: UIControl * aControl = (UIControl *) Absender; – leizh00701

+1

UIControl ist die Basisklasse für Steuerobjekte wie Schaltflächen und Schieberegler, die die Benutzerabsicht an die Anwendung übermitteln. Bitte überprüfen Sie dies unter https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIControl_Class/index .html – Harish

Antwort

19

Fügen Sie eine separate Abbruchaktion mit dem Stil UIAlertActionStyleCancel hinzu. Wenn der Benutzer also außerhalb klickt, erhalten Sie den Rückruf.

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 
    }]]; 

-

+7

Dies funktioniert nicht für den Alert-Stil – JDG

+0

Dies wäre kein Standardverhalten für Alert-Dialoge, da sie immer modal sind. – Gujamin

+0

Auf dem iPhone wird UIAlertActionStyleCancel angezeigt (und Tippen funktioniert nicht), und auf dem iPad ist ausgeblendet, weil es durch eine Tap-Over-Ansicht ersetzt wurde. –

7

Wenn Sie Swift verwenden:

eine Aktion hinzufügen mit addAction(_:) und style:UIAlertActionStyle.Cancel.

Der `Handler wird aufgerufen, wenn Sie auf die Schaltfläche oder außerhalb des Rahmens tippen.

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) 
     })) 

Objective-C:

UIAlertController *alertController = [UIAlertController alertControllerWithTitle:...]; 


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

Funktioniert gut, aber ist es möglich, die Schaltfläche "Schließen" nicht anzuzeigen? – bashan

+0

@bashan Ja, Sie müssen den richtigen 'UIAlertActionStyle' wählen. In diesem Beispiel habe ich den Button auf "Abbrechen" gesetzt. Sie können es auf 'Default' setzen. – thedjnivek

+0

Wenn Sie die Taste auf Standard stellen, wird die Funktion zum Schließen des Menüs deaktiviert, wenn Sie außerhalb des Menüs tippen. – bashan

25

Wenn Sie swift verwenden und preferredStyle ist Alarm Sie Schnipsel wie unten verwenden:

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) 
} 

Mit schnellen 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) 
} 
+11

Ab iOS 9.3 müssen Sie den Gestenerkenner der zweiten Untersicht des Superviews ('alert.view.superviewnviews [1]') anstelle der Superview selbst hinzufügen. Wie in der Dokumentation angegeben, ist die Ansichtshierarchie für UIAlertController privat, daher gibt es keine Garantie, dass sie sich in zukünftigen iOS-Versionen nicht ändert. –

+1

Ich habe Ihre Antworten mit sfongxing10000's gemischt, und ich kam mit dem Hinzufügen der Tippgeste zum "alert.view.superview" und all seinen "Unteransichten". Es funktioniert jetzt, iOS 11.2! – FonzTech

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

Der einfachste Weg:

- (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]; 
} 
0

Der einfachste Weg in Obj-C:

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

und dann:

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

Wenn Sie den Super der Debugansicht Warnung, Sie sehen es nicht so einfach wie das Hinzufügen eines TAPT - Gesten - Erkenners zum UITransitionView des _UIAlertControllerView.You können dies tun, anstatt

[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)]; 
     } 
    } 
}]; 
0
- (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]; 
} 
+0

Das funktioniert tatsächlich, wie von iOS 11.2! Ich musste allen Unteransichten die gleiche Tippgeste hinzufügen. – FonzTech