2015-03-07 14 views
23

को खारिज करने से रोकने के लिए मैं UIAlertController को खारिज करने से रोकना चाहता हूं।UIAlertController को

मेरे पास UIAlertAction है जो बस UIAlertTextField में एक स्ट्रिंग जोड़ता है, हालांकि, एक बार टैप किया गया यह दृश्य नियंत्रक [अवांछित] को खारिज कर देता है। मैंने अवांछित परिणामों के साथ एनएसएनोटिफिकेशन जोड़ने का प्रयास किया है।

[alertC canPerformAction:@selector(dismissViewControllerAnimated:completion:) withSender:pasteMessage]; 

-(void)dismissViewControllerAnimated:(BOOL)flag completion:(void (^)(void))completion { 
    UIAlertController *alertController = (UIAlertController *)self.presentedViewController; 
    UIAlertAction *paste = alertController.actions.firstObject; 
     if (paste) { 
     flag = NO; 
     } else { 
     flag = YES; 
     } 
} 

संपादित करें, मैं UIAlertAction का दोहन को रोकने के लिए मैं UIAlertController से रोकने के लिए देख रहा हूँ नहीं देख रहा हूँ:

UIAlertAction *pasteMessage = [UIAlertAction actionWithTitle:@"Paste Message" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { 
     UITextField *textField = alertC.textFields.firstObject; 
     textField.text = [textField.text stringByAppendingString:[NSString stringWithFormat:@"%@", copiedString]]; 
    }]; 

मैं भी द्वारा pasteMessage करने के लिए कोई स्थापित करने की कोशिश की है कहा कार्रवाई पर टैप करते समय खारिज कर दिया। कार्रवाई को सक्षम/अक्षम किया जा सकता है, लेकिन मेरा लक्ष्य प्रतिलिपि संदेश को UITextField में एक क्रिया दबाकर पेस्ट करना है (इसलिए कारण मैं इसे खारिज नहीं करना चाहता)

मुझे भी BOOL सेट करने का एहसास है dismissViewControllerAnimated: पर इसे पर सेट नहीं किया गया दृश्य नियंत्रक बर्खास्तगी को एनिमेट करता है, मैं नहीं चाहता कि यह वास्तविक बर्खास्तगी प्रक्रिया को रोकने के लिए था। बस उन चीज़ों की पेशकश करना जो मैंने अपने लक्ष्य के संबंध में किया है। मैंने नयाUIAlertController प्रस्तुत करने का भी प्रयास किया है जब पेस्ट मैसेज UIAlertControllers कॉपी किए गए संदेश के साथ टेक्स्टफिल्ड ऑटो-पॉप्युलेटिंग, यह काम करता है, लेकिन मुझे लगता है कि यह क्या किया जा सकता है इसके लिए यह बहुत हैकी है।

+0

संभावित डुप्लिकेट [UIAlertController को बर्खास्त करना रोकें] (http://stackoverflow.com/questions/25628000/prevent-dismissal-of-uialertcontroller) –

+0

धन्यवाद @ लिंडसेस्कॉट मेरे प्रश्न का सही समाधान नहीं है। यह टेक्स्टफ़ील्ड पर टेक्स्ट रखने के आधार पर एक बटन को सक्षम करने से रोकता है: यहां उनका समाधान है: '= (tf.text! =" ") 'जो कि दृश्य को बर्खास्त होने से बटन को अक्षम करता है _eventually_ – soulshined

+0

लेकिन मुझे लगता है उस उत्तर का सबसे प्रासंगिक हिस्सा 'UIAlertAction' * का चयन कर रहा है * आपकी चेतावनी को खारिज कर देगा। यदि आप कुछ अन्य व्यवहार चाहते हैं, तो अपना खुद का कस्टम व्यू बनाने का प्रयास करें। –

उत्तर

21

संपादित करें:

स्विफ्ट 3

के लिए अपडेट किया गया तो मैं वास्तव में इस काम मिल गया। संक्षेप में, इसमें UIAlertController पर एक इशारा पहचानकर्ता जोड़ना शामिल है जो बर्खास्तगी से पहले ट्रिगर्स होता है।

सबसे पहले, आप lazily अपने UIAlertController गणना चर लोड बनाकर उसे UIAlertAction आप अपना दृश्य नियंत्रक पर आरंभ होने से रोकने के लिए इतना है कि वे इशारा पहचानकर्ता के चयनकर्ता विधि द्वारा सुलभ हो चाहते हैं (चयनकर्ता में self insinuates कि यह सब एक दृश्य नियंत्रक के अंदर है)।

lazy var alert: UIAlertController = { 

    let alert = UIAlertController(title: "Title", message: "Message", preferredStyle: .alert) 

    alert.addTextField(configurationHandler: nil) 

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

    alert.addAction(appendAction) 
    alert.addAction(cancelAction) 

    let gestureRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(self.append(sender:))) 
    gestureRecognizer.minimumPressDuration = 0.0 
    alert.view.addGestureRecognizer(gestureRecognizer) 

    return alert 
}() 

lazy var appendAction: UIAlertAction = { 
    return UIAlertAction(title: "Paste Message", style: .default, handler: nil) 
}() 

यकीन है कि इसके बाद के संस्करण अपने इशारे पहचानकर्ता 0. की एक न्यूनतम प्रेस अवधि इस तरह आप से पहले कार्रवाई पूरी तरह से शुरू हो रहा है (जब उपयोगकर्ता नीचे से छू के लिए) इशारा के राज्य का उपयोग कर सकते के साथ एक UILongPressGestureRecognizer सेट है। वहां आप UIAlertAction को अक्षम कर सकते हैं, अपने कस्टम कोड को कार्यान्वित कर सकते हैं, और इशारा पूरा होने के बाद कार्रवाई को पुन: सक्षम कर सकते हैं (उपयोगकर्ता ने छुआ है)। नीचे देखें:

@objc func append(sender: UILongPressGestureRecognizer) { 

    if sender.state == .began { 
     appendAction.isEnabled = false 
    } else if sender.state == .ended { 
     // Do whatever you want with the alert text fields 
     print(alert.textFields![0].text) 
     appendAction.isEnabled = true 
    } 
} 

फिर आप कहीं भी UIAlertController प्रस्तुत करते हैं।

@IBAction func showAlert(sender: AnyObject) { 
    self.present(alert, animated: true, completion: nil) 
} 

यह स्पष्ट रूप से एक हैक है, लेकिन कोई दूसरा रास्ता नहीं है कि मैं के बारे में पता हैक बिना इस लक्ष्य को हासिल करने के लिए के बाद से यह प्राप्त किया जा करने के लिए नहीं है। उदाहरण के लिए, इशारा पहचानकर्ता UIAlertController से जुड़ा हुआ है ताकि उपयोगकर्ता उस विधि को ट्रिगर कर सके यदि वे अलर्ट (रद्द बटन के अलावा) पर कहीं भी टैप करते हैं।

मूल जवाब:

इस रूप में करीब है के रूप में मैं एक hackaround करने के लिए आ सकता है। अगर वहाँ कुछ भी नहीं करने के लिए बर्खास्तगी संक्रमण समय अनुकूलित करने के लिए किसी तरह था तो आप गलत पर animated: सेट कर सकते हैं और यह एक ही चेतावनी की तरह लग रहे हैं, लेकिन मैं यह संभव है नहीं लगता

class ViewController: UIViewController { 

    @IBAction func alert(sender: AnyObject) { 
     let alert = UIAlertController(title: "title", message: "message", preferredStyle: .Alert) 

     alert.addTextFieldWithConfigurationHandler(nil) 

     let appendAction = UIAlertAction(title: "Append text", style: .Default) { _ in 
      var textField = alert.textFields![0] as UITextField 
      // Append text here 
      self.presentViewController(alert, animated: true, completion: nil) 
     } 

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

     alert.addAction(appendAction) 
     alert.addAction(cancelAction) 

     self.presentViewController(alert, animated: true, completion: nil) 
    } 
} 

मैं के साथ ही परिचित हूँ है तेज

+0

स्विफ्ट कोई चिंता नहीं है। आसानी से अनुवाद योग्य। हालांकि, मैं शूट करने में परेशानी के लिए कंप्यूटर पर नहीं हूं लेकिन मुझे पूरा यकीन है कि आपका कोड एक त्रुटि का कारण बन जाएगा। आप एक दृश्य नियंत्रक को पहले से मौजूद होने पर पेश करने की कोशिश कर रहे हैं। इसके अलावा, एनीमेशन को झूठी सेटिंग के बारे में अपनी टिप्पणी दोबारा, मेरे संपादन से पहले मैंने जो संपादन किया था, उसे देखें, यह 'कामकाज' था, लेकिन मैं इसे एक संकल्प के रूप में खुश नहीं हूं, इसलिए मैं यहां पूछने लगा – soulshined

+0

मैंने सिम्युलेटर में कोड चलाया और यह ठीक काम किया। आपका संपादन नहीं देखा, मेरा बुरा। – Aaron

+0

आपका कामकाज मेरा काम था। प्रयास के लिए वोट दें। इनपुट के लिए धन्यवाद। बस अपना खुद का – soulshined

0

सुंदर ज्यादा एक ही सवाल का जवाब दे रहा है here

पाठ अलर्ट पर क्षेत्र का पेस्ट विकल्प का समर्थन करता है, इसलिए वहाँ अलर्ट पर अलग बटन इंगित करने के लिए "पेस्ट" विकल्प होता है करने के लिए कोई वास्तविक कारण है।

अन्यथा आपको UIAlertController की नकल करना चाहिए और इच्छावादी व्यवहार के साथ इसे पुन: कार्यान्वित करना चाहिए।

+0

यह वही सवाल नहीं है। ऊपर मेरी टिप्पणियां देखें। वह प्रश्न टेक्स्ट सत्यापन के लिए है। मेरा सवाल बर्खास्तगी को प्रतिबंधित करने के लिए कड़ाई से है। और मेरे परिस्थिति के लिए एक वास्तविक कारण है। सिर्फ इसलिए कि पेस्ट विकल्प है इसका मतलब यह नहीं है कि यह पिछले 10 पेस्ट याद करता है। यह केवल चिपकाएगा जो पिछली बार क्लिपबोर्ड पर कॉपी किया गया था। मेरा पेस्ट बटन एक सिंगलटन है जिसे आईफोन के पेस्ट विकल्प को अनदेखा करते हुए एप चौड़ा याद किया जाता है (इस तरह उपयोगकर्ता यदि भी चाहें तो इसका उपयोग कर सकते हैं)। हालांकि इनपुट के लिए धन्यवाद - कुछ भी नहीं से बेहतर कुछ। – soulshined

संबंधित मुद्दे