2015-08-30 19 views
7

इनपुट के बाद UIAlertController के UIAlertAction को सक्षम करें, मैं UITextField और एक UIAlertAction बटन "ठीक" लेबल वाला एक संवाद प्रस्तुत करने के लिए UIAlertController का उपयोग कर रहा हूं। मैं बटन को कैसे अक्षम करूं जब तक कि कई वर्ण (5 वर्ण कहें) UITextField में इनपुट हैं?इनपुट

अपने हेडर फाइल में
+0

आप .. UITextField लंबाई की जांच करने की आवश्यकता है UITextField लंबाई 5 फिर बटन सक्षम हो जाएगा अन्य बुद्धिमान नहीं –

उत्तर

15

जोड़ें निम्नलिखित संपत्ति

@property(nonatomic, strong)UIAlertAction *okAction; 

फिर अपने वर्ग में आपकी ViewController

self.okAction = [UIAlertAction actionWithTitle:@"OK" 
             style:UIAlertActionStyleDefault 
             handler:nil]; 
self.okAction.enabled = NO; 

UIAlertController *controller = [UIAlertController alertControllerWithTitle:nil 
                    message:@"Enter your text" 
                  preferredStyle:UIAlertControllerStyleAlert]; 

[controller addTextFieldWithConfigurationHandler:^(UITextField *textField) { 

    textField.delegate = self; 
}]; 

[controller addAction:self.okAction]; 
[self presentViewController:controller animated:YES completion:nil]; 

इसके अलावा के अपने viewDidLoad विधि में निम्न कोड की प्रतिलिपि को लागू निम्नलिखित UITextField प्रतिनिधि विधि

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{ 

    NSString *finalString = [textField.text stringByReplacingCharactersInRange:range withString:string]; 
    [self.okAction setEnabled:(finalString.length >= 5)]; 
    return YES; 
} 

यह काम

13

आप अपने UITextField को एक पर्यवेक्षक जोड़ सकते हैं चाहिए:

[alertController addTextFieldWithConfigurationHandler:^(UITextField *textField) { 
    [textField addTarget:self action:@selector(alertControllerTextFieldDidChange:) forControlEvents:UIControlEventEditingChanged]; 
} 

लेकिन पहली बार अपने बटन को अक्षम:

okAction.enabled = NO; 

तो विधि आपके द्वारा निर्दिष्ट में यह सत्यापित करें:

- (void)alertTextFieldDidChange:(UITextField *)sender { 
    UIAlertController *alertController = (UIAlertController *)self.presentedViewController; 
    if (alertController) { 
    UITextField *someTextField = alertController.textFields.firstObject; 
    UIAlertAction *okAction = alertController.actions.lastObject; 
    okAction.enabled = someTextField.text.length > 2; 
    } 
} 
+3

यह अच्छा है, अतिरिक्त गुणों के लिए कोई जरूरत नहीं है। मौजूदा एपीआई धन्यवाद –

+1

सही उपयोग – malhal

0

एक बेहतर दृष्टिकोण क्या गलत बुद्धि है के बारे में उपयोगकर्ता को सचेत करने होगा एच इनपुट के सत्यापन के बाद उसका इनपुट, ताकि उपयोगकर्ता जानता है कि ऐप उससे क्या उम्मीद कर रहा है।

- (void)askReasonWithPreviousReason:(NSString *)text 
{ 
    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Alert" message:@"Enter reason" preferredStyle:UIAlertControllerStyleAlert]; 

    [alertController addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) 
    { 
     textField.text = text; 
    }]; 

    [alertController addAction:[UIAlertAction actionWithTitle:@"Save" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) 
           { 
            if ([self isReasonValid:alertController.textFields.firstObject.text]) 
            { 
             UIAlertController *alertController2 = [UIAlertController alertControllerWithTitle:AlertTitle message:@"Are you sure you would like to save?" preferredStyle:UIAlertControllerStyleAlert]; 

             [alertController2 addAction:[UIAlertAction actionWithTitle:@"Yes" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) 
                    { 
                     [self saveReason:alertController.textFields.firstObject.text]; 
                    }]]; 
             [alertController2 addAction:[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:Nil]]; 

             [self presentViewController:alertController2 animated:YES completion:nil]; 
            } 
           }]]; 

    [alertController addAction:[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:Nil]]; 

    [self presentViewController:alertController animated:YES completion:nil]; 
} 

- (BOOL)isReasonValid:(NSString *)reason 
{ 
    NSString *errorMessage = [[NSString alloc] init]; 

    if (reason.length < 5) 
    { 
     errorMessage = @"Reason must be more than 5 characters"; 
    } 
    else if (reason.length > 100) 
    { 
     errorMessage = @"Reason must be less than 100 characters"; 
    } 

    if (errorMessage.length != 0) 
    { 
     UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Alert" message:errorMessage preferredStyle:UIAlertControllerStyleAlert]; 

     [alertController addAction:[UIAlertAction actionWithTitle:@"Ok" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) 
            { 
             [self askReasonWithPreviousReason:reason]; 
            }]]; 

     [self presentViewController:alertController animated:YES completion:nil]; 

     return NO; 
    } 

    return YES; 
} 
4

स्विफ्ट 3 कार्यान्वयन के आधार पर soulshined के जवाब:

var someAlert: UIAlertController { 
    let alert = UIAlertController(title: "Some Alert", message: nil, preferredStyle: .alert) 

    alert.addTextField { 
     $0.placeholder = "Write something" 
     $0.addTarget(self, action: #selector(self.textFieldTextDidChange(_:)), for: .editingChanged) 
    } 

    alert.addAction(UIAlertAction(title: "Cancel", style: .cancel)) 

    let submitAction = UIAlertAction(title: "Submit", style: .default) { _ in 
     // Do something... 
    } 

    submitAction.isEnabled = false 
    alert.addAction(submitAction) 
    return alert 
} 

func textFieldTextDidChange(_ textField: UITextField) { 
    if let alert = presentedViewController as? UIAlertController, 
     let action = alert.actions.last, 
     let text = textField.text { 
     action.isEnabled = text.characters.count > 0 
    } 
} 
+0

आप ('.addTextField अंदर' स्थापित करना चाहिए textField.delegate = self' configurationHandler' – bibscy

0

मैं एक और पोस्ट मूल रूप से stackoverflow पर एक ही सवाल पूछने के लिए an answer था। संक्षेप में, ऐसा करने के कई तरीके हैं: UITextFieldDelegate, अधिसूचना, केवीओ का उपयोग करें, या स्पष्ट रूप से नियंत्रण पर ईवेंट हैंडलिंग लक्ष्य जोड़ें। मेरे समाधान a simple UIAlertController subclass घटना से निपटने के लक्ष्य है कि आप

alert.addTextField(configurationHandler: { (textField) in 
     textField.placeholder = "Your name" 
     textField.autocapitalizationType = .words 
    }) { (textField) in 
     saveAction.isEnabled = (textField.text?.characters.count ?? 0) > 0 
    } 

आप इस तरह के प्रोजेक्ट में कई बार की तुलना में अधिक अलर्ट से निपटने के लिए अगर यह सुविधाजनक होना चाहिए फोन करके बस कॉन्फ़िगर कर सकते हैं चारों ओर लिपटा है।

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