วิธีง่ายๆในการรับกล่องโต้ตอบป๊อปอัปการป้อนข้อความบน iPhone คืออะไร


126

ฉันต้องการรับชื่อผู้ใช้ กล่องโต้ตอบการป้อนข้อความอย่างง่าย วิธีง่ายๆในการทำเช่นนี้?


1
รอเพียงไม่กี่เดือนจนถึงประมาณเดือนกันยายนและชีวิตของคุณจะง่ายขึ้นมาก
โจนาธาน

คำตอบ:


264

ใน iOS 5 มีวิธีใหม่และง่ายในการนี้ ฉันไม่แน่ใจว่าการใช้งานจะเสร็จสมบูรณ์หรือไม่เนื่องจากยังไม่เป็นที่น่าพอใจเช่นพูด a UITableViewCellแต่ควรทำเคล็ดลับอย่างแน่นอนเนื่องจากตอนนี้เป็นมาตรฐานที่รองรับใน iOS API แล้ว คุณไม่จำเป็นต้องมี API ส่วนตัวสำหรับสิ่งนี้

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

สิ่งนี้ทำให้ alertView เช่นนี้ (ภาพหน้าจอที่นำมาจากเครื่องจำลอง iPhone 5.0 ใน XCode 4.2):

ตัวอย่างการแจ้งเตือนพร้อม alertViewStyle ตั้งค่าเป็น UIAlertViewStylePlainTextInput

เมื่อกดปุ่มใด ๆ ระบบจะเรียกใช้เมธอดผู้ร่วมประชุมปกติและคุณสามารถแยก textInput ได้ดังนี้:

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

ที่นี่ฉันแค่ NSLog ผลลัพธ์ที่ป้อน ในโค้ดการผลิตคุณควรกำหนดตัวชี้ไปยัง alertView ของคุณเป็นตัวแปรส่วนกลางหรือใช้แท็ก alertView เพื่อตรวจสอบว่าฟังก์ชันมอบหมายถูกเรียกใช้โดยเหมาะสมหรือไม่UIAlertViewแต่สำหรับตัวอย่างนี้ก็ไม่เป็นไร

คุณควรตรวจสอบUIAlertView APIและคุณจะเห็นว่ามีการกำหนดรูปแบบเพิ่มเติม

หวังว่านี่จะช่วยได้!

- แก้ไข -

ฉันเล่นกับ alertView นิดหน่อยและฉันคิดว่ามันไม่จำเป็นต้องมีการประกาศว่ามันเป็นไปได้อย่างสมบูรณ์แบบที่จะแก้ไข textField ตามที่ต้องการ: คุณสามารถสร้างการอ้างอิงUITextFieldและแก้ไขได้ตามปกติ (โดยทางโปรแกรม) การทำเช่นนี้ฉันสร้าง alertView ตามที่คุณระบุไว้ในคำถามเดิมของคุณ ดีกว่าไม่มาสายใช่ไหม :-)?

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 alertStyle เพื่อถามชื่อผู้ใช้

คุณสามารถใช้วิธีการมอบหมายแบบเดียวกับที่ฉันโพสต์ไว้ก่อนหน้านี้เพื่อประมวลผลผลลัพธ์จากอินพุต ฉันไม่แน่ใจว่าคุณสามารถป้องกันไม่ให้UIAlertViewยกเลิกได้หรือไม่ (ไม่มีshouldDismissฟังก์ชั่นผู้ร่วมประชุม AFAIK) ดังนั้นฉันคิดว่าหากข้อมูลของผู้ใช้ไม่ถูกต้องคุณต้องตั้งค่าการแจ้งเตือนใหม่ (หรือเพิ่งshowนี้ ) จนกว่าอินพุตที่ถูกต้องคือ ป้อน

มีความสุข!


1
ด้วยการนับอ้างอิงอัตโนมัติคุณไม่ควรเก็บและปล่อยวัตถุด้วยตัวเองอีกต่อไป
Waqleh

5
ฉันรู้ แต่คำตอบนี้เขียนในปี 2011
Warkst

3
วิธีนี้คิดค่าเสื่อมราคาตั้งแต่ IOS 9.0 ใช้แทน UIAlertController:
EckhardN

หากคุณต้องการการสนับสนุน Swift 4: stackoverflow.com/a/10689318/525576
John Riselvato

186

เพื่อให้แน่ใจว่าคุณได้รับการติดต่อกลับหลังจากผู้ใช้ป้อนข้อความให้ตั้งค่าผู้รับมอบสิทธิ์ภายในตัวจัดการการกำหนดค่า textField.delegate = self

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

ใน Swift (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)
}

ใน Objective-C (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 ใช้งานได้)

เพียงเพื่อเพิ่มเวอร์ชันอื่น

UIAlert ด้วย UITextField

- (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 แต่ดูเหมือนว่าจะพังใน OS 7 ตอนนี้ใช้รหัสของ Wakrst - บันทึกโค้ดหลายบรรทัด
Dave Appleton

แล้ววิธีที่ถูกต้องในการทำ iOS7 คืออะไร? เรากำลังสร้างด้วย iOS6 SDK แต่ก็ยังแสดงให้เห็นแปลก ๆ บน iOS7
sebrock

เพิ่มการรองรับ iOS7 สำหรับคำถาม
John Riselvato

1
พบว่าฉันต้องใส่สิ่งต่อไปนี้ในalertView:(UIAlertView *) clickedButtonAtIndex:(NSInteger)buttonIndexวิธีการมอบหมายของฉันเพื่อดึงค่าของ textField.text:“ NSString * theMessage = [alertView textFieldAtIndex: 0] .text; `
James Perih

1
แทนที่ "var alert" ด้วย "let alert" ในโค้ดที่รวดเร็วเพื่อให้สอดคล้องกับ swift เวอร์ชันล่าสุด
Matei Suica

11

ทดสอบข้อมูลโค้ดที่สามของ Warkst - ใช้งานได้ดียกเว้นฉันเปลี่ยนเป็นประเภทอินพุตเริ่มต้นแทนที่จะเป็นตัวเลข:

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

จุดดี! ฉันยุ่งเกี่ยวกับ textField ในเวลานั้นและลืมเปลี่ยนประเภทแป้นพิมพ์ก่อนที่จะอัปโหลดข้อมูลโค้ด ดีใจที่รหัสของฉันช่วยคุณได้!
Warkst

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ข้อความ ในการทำสิ่งนี้คุณต้องเพิ่มคลาส delegate ก่อนซึ่งอาจมีลักษณะดังนี้:

@interface YourViewController : UIViewController <UIAlertViewDelegate>

นอกจากนี้คุณสามารถดูบทแนะนำที่เป็นประโยชน์ได้ที่นี่ !

หวังว่านี่จะช่วยได้


5

ลองใช้รหัส Swift นี้ใน 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

Swift 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: @ "ชื่อของคุณอยู่ที่นี่" ข้อความ: @ "สิ่งนี้ได้รับการคุ้มครอง" delegate: self CancelButtonTitle: @ "ยกเลิก" otherButtonTitles: @ "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

ฉันลองใช้รหัสที่คล้ายกันและแสดงมุมมองการแจ้งเตือนพร้อมกล่องข้อความและปุ่ม แต่ไม่มีที่ว่างเพียงพอสำหรับช่องข้อความมันติดอยู่ระหว่างชื่อเรื่องและปุ่มและแตะทั้งสองอย่าง ฉันลองแปลงร่างเพื่อปรับขนาดเฟรม แต่ปุ่มยังคงอยู่ที่เดิมดังนั้นจึงต้องย้ายด้วย ฉันไม่รู้ว่าจะเปลี่ยนตำแหน่งปุ่มอย่างไรและฉันไม่อยากเชื่อเลยว่าทั้งหมดนี้จำเป็นในการดึงข้อความบรรทัดเดียวจากข้อความแจ้งไปยังผู้ใช้ ไม่มีวิธีที่ดีกว่านี้อีกแล้วหรือ
Dean Davids

2

เพิ่มมุมมองการ UIAlertView เช่นนี้ ใน iOS 5 มี "เวทมนตร์" บางอย่างที่ทำเพื่อคุณ (แต่ทั้งหมดนี้อยู่ภายใต้ NDA)


ฉันลองสิ่งนี้แล้วและได้ผลบ้าง ยกเว้นป๊อปอัปจะปิดหน้าจอ (ครึ่งบนของป๊อปอัปจะถูกตัดออก) ความคิดใด ๆ ทำไม?
user605957

ฉันมีปัญหาเดียวกันการลบ setTranformMakeTranslation (0,109) แก้ไขให้ฉันทั้งบน ipad และ iphone มันปรากฏขึ้นในสถานที่ที่เหมาะสมโดยไม่มีมัน
joeld

2

ใน Xamarin และ C #:

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

สร้างตามคำตอบของ John Riselvato เพื่อดึงสตริงกลับจาก UIAlertView ...

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];
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.