IPhone पर टेक्स्ट इनपुट पॉपअप डायलॉग बॉक्स प्राप्त करने का एक सरल तरीका क्या है


125

मैं उपयोगकर्ता नाम प्राप्त करना चाहता हूं। एक साधारण पाठ इनपुट संवाद बॉक्स। ऐसा करने का कोई सरल तरीका?


1
बस कुछ महीनों तक प्रतीक्षा करें, सितंबर के बारे में, और आप जीवन बहुत आसान हो जाएगा ।
जोनाथन।

जवाबों:


264

IOS 5 में इसका एक नया और आसान तरीका है। मुझे यकीन नहीं है कि कार्यान्वयन पूरी तरह से पूरा हो गया है, क्योंकि यह एक अनुग्रह के रूप में नहीं है, कहते हैं UITableViewCell, लेकिन यह निश्चित रूप से चाल करना चाहिए क्योंकि यह अब आईओएस एपीआई में समर्थित मानक है। इसके लिए आपको एक निजी एपीआई की आवश्यकता नहीं होगी।

UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"Alert" message:@"This is an example alert!" delegate:self cancelButtonTitle:@"Hide" otherButtonTitles:nil];
alert.alertViewStyle = UIAlertViewStylePlainTextInput;
[alert show];
[alert release];

यह इस तरह एक चेतावनी दृश्य प्रस्तुत करता है (XCode 4.2 में iPhone 5.0 सिम्युलेटर से लिया गया स्क्रीनशॉट):

UIAlertViewStylePlainTextInput पर सेट किए गए अलर्ट दृश्य के साथ चेतावनी चेतावनी

किसी भी बटन को दबाते समय, नियमित प्रतिनिधि विधियों को बुलाया जाएगा और आप textInput को इस तरह निकाल सकते हैं:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{ 
    NSLog(@"Entered: %@",[[alertView textFieldAtIndex:0] text]);
}

यहां मैं सिर्फ NSLog का परिणाम दर्ज किया गया था। उत्पादन कोड में, आपको संभवतः एक वैश्विक चर के रूप में अपने अलर्टव्यू के लिए एक संकेतक रखना चाहिए या यह देखने के लिए कि क्या प्रतिनिधि को उचित द्वारा बुलाया गया था, यह जांचने के लिए अलर्ट व्यू टैग का उपयोग करें, UIAlertViewलेकिन इस उदाहरण के लिए यह ठीक होना चाहिए।

आपको UIAlertView API की जाँच करनी चाहिए और आप देखेंगे कि कुछ और शैलियाँ परिभाषित हैं।

उम्मीद है कि इस मदद की!

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

मैं चारों ओर से अलर्टव्यू के साथ खेल रहा था और मुझे लगता है कि इसे कोई घोषणा की आवश्यकता नहीं है कि टेक्स्टफिल्ड को वांछित रूप से संपादित करना पूरी तरह से संभव है: आप एक संदर्भ बना सकते हैं UITextFieldऔर इसे सामान्य (प्रोग्रामेटिक रूप से) संपादित कर सकते हैं । ऐसा करते हुए मैंने आपके मूल प्रश्न में निर्दिष्ट अलर्ट व्यू का निर्माण किया। कभी नहीं से देर भली, ठीक :-)?

UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"Hello!" message:@"Please enter your name:" delegate:self cancelButtonTitle:@"Continue" otherButtonTitles:nil];
alert.alertViewStyle = UIAlertViewStylePlainTextInput;
UITextField * alertTextField = [alert textFieldAtIndex:0];
alertTextField.keyboardType = UIKeyboardTypeNumberPad;
alertTextField.placeholder = @"Enter your name";
[alert show];
[alert release];

यह इस चेतावनी का उत्पादन करता है:

UIAlertView उपयोगकर्ता का नाम पूछने के लिए UIAlertViewPlainTextInput अलर्ट का उपयोग करता है

इनपुट से परिणाम को संसाधित करने के लिए आप पहले की तरह ही प्रतिनिधि विधि का उपयोग कर सकते हैं। मुझे यकीन नहीं है कि अगर आप इसे UIAlertViewखारिज करने से रोक सकते हैं (कोई shouldDismissप्रतिनिधि कार्य नहीं है AFAIK) तो मुझे लगता है कि यदि उपयोगकर्ता इनपुट अमान्य है, तो आपको showसही इनपुट होने तक एक नया अलर्ट डालना होगा (या बस इसे फिर से शुरू करना होगा)। घुसा।

मज़े करो!


1
ऑटोमैटिक रेफरेंस काउंटिंग के साथ, आप अब ऑब्जेक्ट्स को खुद को बनाए रखना और रिलीज करना नहीं चाहते हैं।
वकलेह

5
मुझे पता है, लेकिन यह जवाब 2011 में लिखा गया था
वॉर्क्स

3
IOS 9.0 के बाद से विधि का मूल्यह्रास किया गया है। UIAlertController के बजाय का उपयोग करें:
EckhardN

यदि आप स्विफ्ट 4 के साथ समर्थन देख रहे हैं: stackoverflow.com/a/10689318/525576
जॉन रिसेल्वेटो

186

यह सुनिश्चित करने के लिए कि उपयोगकर्ता द्वारा पाठ में प्रवेश करने के बाद आपको कॉल बैक मिलता है, कॉन्फ़िगरेशन हैंडलर के अंदर प्रतिनिधि को सेट करें। textField.delegate = self

स्विफ्ट 3 और 4 (iOS 10 - 11):

let alert = UIAlertController(title: "Alert", message: "Message", preferredStyle: UIAlertControllerStyle.alert)
alert.addAction(UIAlertAction(title: "Click", style: UIAlertActionStyle.default, handler: nil))
alert.addTextField(configurationHandler: {(textField: UITextField!) in
    textField.placeholder = "Enter text:"
    textField.isSecureTextEntry = true // for password input
})
self.present(alert, animated: true, completion: nil)

स्विफ्ट (iOS 8-10) में:

यहाँ छवि विवरण दर्ज करें

override func viewDidAppear(animated: Bool) {
    var alert = UIAlertController(title: "Alert", message: "Message", preferredStyle: UIAlertControllerStyle.Alert)
    alert.addAction(UIAlertAction(title: "Click", style: UIAlertActionStyle.Default, handler: nil))
    alert.addTextFieldWithConfigurationHandler({(textField: UITextField!) in
        textField.placeholder = "Enter text:"
        textField.secureTextEntry = true
        })
    self.presentViewController(alert, animated: true, completion: nil)
}

उद्देश्य-सी (iOS 8) में:

- (void) viewDidLoad 
{
    UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"Alert" message:@"Message" preferredStyle:UIAlertControllerStyleAlert];
    [alert addAction:[UIAlertAction actionWithTitle:@"Click" style:UIAlertActionStyleDefault handler:nil]];
    [alert addTextFieldWithConfigurationHandler:^(UITextField *textField) {
        textField.placeholder = @"Enter text:";
        textField.secureTextEntry = YES;
    }];
    [self presentViewController:alert animated:YES completion:nil];
}

IOS 5-7 के लिए:

UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"Alert" message:@"INPUT BELOW" delegate:self cancelButtonTitle:@"Hide" otherButtonTitles:nil];
alert.alertViewStyle = UIAlertViewStylePlainTextInput;
[alert show];

यहाँ छवि विवरण दर्ज करें


नोट: नीचे iOS 7 (iOS 4 - 6 वर्क्स) के साथ काम नहीं करता है

बस एक और संस्करण जोड़ने के लिए।

यूआईल्टफिल्ड के साथ यूआईलर्ट

- (void)viewDidLoad{

    UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"Preset Saving..." message:@"Describe the Preset\n\n\n" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Ok", nil];
    UITextField *textField = [[UITextField alloc] init];
    [textField setBackgroundColor:[UIColor whiteColor]];
    textField.delegate = self;
    textField.borderStyle = UITextBorderStyleLine;
    textField.frame = CGRectMake(15, 75, 255, 30);
    textField.placeholder = @"Preset Name";
    textField.keyboardAppearance = UIKeyboardAppearanceAlert;
    [textField becomeFirstResponder];
    [alert addSubview:textField];

}

तब मैं फोन करता हूं [alert show];जब मैं चाहता हूं।

वह विधि जो साथ चलती है

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {         
    NSString* detailString = textField.text;
    NSLog(@"String is: %@", detailString); //Put it on the debugger
    if ([textField.text length] <= 0 || buttonIndex == 0){ 
        return; //If cancel or 0 length string the string doesn't matter
    }
    if (buttonIndex == 1) {
        ...

    }
}


1
IOS 4 के बाद से मेरे पास ऐसा कुछ था, लेकिन यह ओएस 7 में टूटने लगता है अब Wakrst के कोड का उपयोग करें - कोड की कई पंक्तियों को सहेजें।
डेव ऐपलेटन

तो, iOS7 के लिए ऐसा करने का सही तरीका क्या होगा? हम iOS6 SDK के साथ निर्माण कर रहे हैं लेकिन यह अभी भी iOS7 पर अजीब दिखाता है।
सेब्रोक

सवाल के लिए iOS7 समर्थन जोड़ा
जॉन Riselvato

1
पाया कि मुझे alertView:(UIAlertView *) clickedButtonAtIndex:(NSInteger)buttonIndextextField.text का मान प्राप्त करने के लिए अपने प्रतिनिधि विधि में निम्नलिखित रखना था : `NSString * theMessage = [alertView textFieldAtIndex: 0] .text;`
James Perih

1
स्विफ्ट कोड में "वॉर अलर्ट" को स्विफ्ट कोड में बदलें ताकि स्विफ्ट के नवीनतम संस्करण का अनुपालन किया जा सके
मेटी सुइका

11

वर्स्ट के तीसरे कोड स्निपेट का परीक्षण किया गया - महान काम किया, सिवाय इसके कि मैंने इसे संख्यात्मक के बजाय डिफ़ॉल्ट इनपुट प्रकार में बदल दिया:

UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"Hello!" message:@"Please enter your name:" delegate:self cancelButtonTitle:@"Continue" otherButtonTitles:nil];
alert.alertViewStyle = UIAlertViewStylePlainTextInput;
UITextField * alertTextField = [alert textFieldAtIndex:0];
alertTextField.keyboardType = UIKeyboardTypeDefault;
alertTextField.placeholder = @"Enter your name";
[alert show];

अच्छी बात! मैं उस समय टेक्स्टफीड के साथ खिलवाड़ कर रहा था और कोड स्निपेट अपलोड करने से पहले कीबोर्ड का प्रकार बदलना भूल गया था। खुशी है कि मेरा कोड आपकी मदद कर सकता है!
वारस्ट

11

IOS 9.0 के बाद से UIAlertController का उपयोग करें:

UIAlertController* alert = [UIAlertController alertControllerWithTitle:@"My Alert"
                                                           message:@"This is an alert."
                                                          preferredStyle:UIAlertControllerStyleAlert];

UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault
                                                  handler:^(UIAlertAction * action) {
                    //use alert.textFields[0].text
                                                       }];
UIAlertAction* cancelAction = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleDefault
                                                      handler:^(UIAlertAction * action) {
                                                          //cancel action
                                                      }];
[alert addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {
    // A block for configuring the text field prior to displaying the alert
}];
[alert addAction:defaultAction];
[alert addAction:cancelAction];
[self presentViewController:alert animated:YES completion:nil];

5

बस जानकारी का एक महत्वपूर्ण टुकड़ा जोड़ना चाहता था जो मुझे लगता है कि शायद इस धारणा के साथ छोड़ दिया गया था कि जवाब मांगने वाले पहले से ही जानते हैं। यह समस्या बहुत कुछ होती है और मैंने भी अपने आप को तब फँसा पाया जब मैंने संदेश viewAlertके बटन के लिए विधि को लागू करने का प्रयास किया UIAlertView। ऐसा करने के लिए आपको 1 प्रतिनिधि वर्ग जोड़ना होगा जो कुछ इस तरह दिख सकता है:

@interface YourViewController : UIViewController <UIAlertViewDelegate>

इसके अलावा, आप यहाँ एक बहुत ही उपयोगी ट्यूटोरियल पा सकते हैं !

उम्मीद है की यह मदद करेगा।


5

इस स्विफ्ट कोड को UIViewController में आज़माएं -

func doAlertControllerDemo() {

    var inputTextField: UITextField?;

    let passwordPrompt = UIAlertController(title: "Enter Password", message: "You have selected to enter your passwod.", preferredStyle: UIAlertControllerStyle.Alert);

    passwordPrompt.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: { (action) -> Void in
        // Now do whatever you want with inputTextField (remember to unwrap the optional)

        let entryStr : String = (inputTextField?.text)! ;

        print("BOOM! I received '\(entryStr)'");

        self.doAlertViewDemo(); //do again!
    }));


    passwordPrompt.addAction(UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Default, handler: { (action) -> Void in
        print("done");
    }));


    passwordPrompt.addTextFieldWithConfigurationHandler({(textField: UITextField!) in
        textField.placeholder = "Password"
        textField.secureTextEntry = false       /* true here for pswd entry */
        inputTextField = textField
    });


    self.presentViewController(passwordPrompt, animated: true, completion: nil);


    return;
}

3

स्विफ्ट 3:

let alert = UIAlertController(title: "Alert", message: "Message", preferredStyle: UIAlertControllerStyle.alert)
alert.addAction(UIAlertAction(title: "Click", style: UIAlertActionStyle.default, handler: nil))
alert.addTextField(configurationHandler: {(textField: UITextField!) in
     textField.placeholder = "Enter text:"
})

self.present(alert, animated: true, completion: nil)

2

मैं UIAlertViewएक UITextFieldसबव्यू के साथ प्रयोग करूंगा । आप या तो पाठ फ़ील्ड को मैन्युअल रूप से जोड़ सकते हैं या iOS 5 में, नए तरीकों में से एक का उपयोग कर सकते हैं।


मैंने एक और पोस्ट से निम्नलिखित कोड जोड़ा, लेकिन पॉपअप स्क्रीन को दिखाता है (बहुत ऊपर, केवल नीचे आधा दृश्य के साथ)
user605957

2
codeUIAlertView * myAlertView = [[UIAlertView आवंटन] initWithTitle: @ "आपका शीर्षक यहाँ" संदेश: @ "यह कवर हो गया" प्रतिनिधि: self CancelButtonTitle: @ "रद्द करें" otherButtonTmarks: @ "OK", nil]; UITextField * myTextField = [[UITextField आवंटन] initWithFrame: CGRectMake (12.0, 45.0, 260.0, 25.0)]; CGAffineTransform myTransform = CGAffineTransformMakeTranslation (0.0, 130.0); [myAlertView setTransform: myTransform]; [myTextField setBackgroundColor: [UIColor whiteColor]]; [myAlertView addSubview: myTextField]; [myAlertView शो]; [myAlertView रिलीज़];
user605957

मैंने इसी तरह के कोड की कोशिश की और यह टेक्स्ट बॉक्स और बटन के साथ अलर्ट दृश्य प्रदर्शित करता है लेकिन टेक्स्टफील्ड के लिए पर्याप्त जगह नहीं है, यह शीर्षक और बटन के बीच फंस गया है और उन दोनों को छूता है। मैंने फ्रेम को स्केल करने के लिए कुछ ट्रांसफ़ॉर्म की कोशिश की लेकिन बटन वहीं रहे जहाँ वे थे तो उन्हें भी स्थानांतरित करने की आवश्यकता थी। मुझे नहीं पता कि बटन को कैसे रिपोज किया जाए और मुझे विश्वास नहीं हो रहा है कि उपयोगकर्ता के लिए एक संकेत से पाठ की एक पंक्ति को पुनः प्राप्त करना आवश्यक है। क्या इससे बेहतर तरीका नहीं है?
डीन डेविड्स

2

इस तरह से UIAlertView में दृश्य जोड़ें । आईओएस 5 में कुछ "जादू" चीजें हैं जो इसे आपके लिए करती हैं (लेकिन यह सब एनडीए के तहत है)।


मैंने यह कोशिश की और यह कुछ हद तक काम करता है। पॉपअप को छोड़कर स्क्रीन बंद है (पॉपअप का शीर्ष आधा कटा हुआ है)। कोई विचार क्यों?
user605957

मुझे एक ही समस्या थी, setTranformMakeTranslation (0,109) को हटाकर इसे मेरे लिए ipad और iphone दोनों पर तय किया। यह इसके बिना सही जगह पर दिखा।
6

2

ज़मीरिन और सी # में:

var alert = new UIAlertView ("Your title", "Your description", null, "Cancel", new [] {"OK"});
alert.AlertViewStyle = UIAlertViewStyle.PlainTextInput;
alert.Clicked += (s, b) => {
    var title = alert.ButtonTitle(b.ButtonIndex);
    if (title == "OK") {
        var text = alert.GetTextField(0).Text;
        ...
    }
};

alert.Show();

0

UislertView से स्ट्रिंग को वापस प्राप्त करने के लिए जॉन रिसेल्वाटो के उत्तर पर बिल्डिंग ...

alert.addAction(UIAlertAction(title: "Submit", style: UIAlertAction.Style.default) { (action : UIAlertAction) in
            guard let message = alert.textFields?.first?.text else {
                return
            }
            // Text Field Response Handling Here
        })

-1
UIAlertview *alt = [[UIAlertView alloc]initWithTitle:@"\n\n\n" message:nil delegate:nil cancelButtonTitle:nil otherButtonTitles:@"OK", nil];

UILabel *lbl1 = [[UILabel alloc]initWithFrame:CGRectMake(25,17, 100, 30)];
lbl1.text=@"User Name";

UILabel *lbl2 = [[UILabel alloc]initWithFrame:CGRectMake(25, 60, 80, 30)];
lbl2.text = @"Password";

UITextField *username=[[UITextField alloc]initWithFrame:CGRectMake(130, 17, 130, 30)];
UITextField *password=[[UITextField alloc]initWithFrame:CGRectMake(130, 60, 130, 30)];

lbl1.textColor = [UIColor whiteColor];
lbl2.textColor = [UIColor whiteColor];

[lbl1 setBackgroundColor:[UIColor clearColor]];
[lbl2 setBackgroundColor:[UIColor clearColor]];

username.borderStyle = UITextBorderStyleRoundedRect;
password.borderStyle = UITextBorderStyleRoundedRect;

[alt addSubview:lbl1];
[alt addSubview:lbl2];
[alt addSubview:username];
[alt addSubview:password];

[alt show];
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.