ios - UIAlertController के बाहर टैप करने पर UIAlertController को कैसे खारिज करें?




uialertview (7)

स्विफ्ट, एक्सकोड 9

रद्द बटन के साथ AlertController खारिज करें

अपने अलर्ट को नियंत्रित करें, जहां UIAlertAction की शैली .cancel

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

इस पद्धति का उपयोग करते हुए अलर्टकंट्रोलर को खारिज कर दिया जाएगा जब उपयोगकर्ता एक्शन बटन को रद्द करने के साथ-साथ अलर्टकंट्रोलर के बाहर टैप करेगा।

अगर आप नहीं चाहते हैं कि अलर्टकंट्रोलर के बाहर टच करने के बाद उपयोगकर्ता अलर्टकंट्रोलर को खारिज कर दे, तो वर्तमान विधि को पूरा करने में अलर्टकंट्रोलर के पहले साक्षात्कार के उपयोगकर्ता इंटरैक्शन को अक्षम करें।

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

कंट्रोलर दृश्य के बाहर टचअप पर अलर्ट अलर्ट को नियंत्रित करें

यदि आप अपने नियंत्रक दृश्य में बटन को रद्द नहीं करना चाहते हैं और नियंत्रक को बाहर करना चाहते हैं जब उपयोगकर्ता नियंत्रक दृश्य के बाहर टचअप करता है, तो ऐसा करें

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

UIAlertController बाहर टैप करने पर UIAlertController को कैसे खारिज करें?

मैं UIAlertAction की UIAlertActionStyleCancel शैली को UIAlertActionStyleCancel को खारिज करने के लिए UIAlertController

लेकिन मैं फ़ंक्शन को जोड़ना चाहता हूं कि जब उपयोगकर्ता UIAlertController के बाहर टैप करता है तो UIAlertController खारिज कर देगा। उसको कैसे करे? धन्यवाद।


ओबज-सी में सबसे आसान तरीका:

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

और फिर:

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

यदि आप iOS> 9.3 वाले उपकरणों को लक्षित कर रहे हैं और स्विफ्ट और पसंदीदा स्टाइल का उपयोग कर रहे हैं तो आप नीचे दिए गए स्निपेट का उपयोग कर सकते हैं:

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

तेजी के साथ 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)
}

यदि आप अलर्ट के सुपरवाइज को डिबग करते हुए देखते हैं, तो आप इसे उतना सरल नहीं देखते हैं, जितना कि _UIAlertControllerView के UITransitionView में एक टैप जेस्चर पहचानकर्ता को जोड़ना। आप इसके बजाय ऐसा कर सकते हैं

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

सबसे सरल तरीका:

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

स्विफ्ट 4:

एक्शन शीट को तब खारिज करें जब उपयोगकर्ता एक्शन शीट के बाहर टैप करता है, जो यूआईएलर्टकंट्रोलर का उपयोग करके बनाया गया है

सांकेतिक टुकड़ा:

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

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




uialertcontroller