在iPhone上获取文本输入弹出对话框的简单方法是什么


127

我想获取用户名。一个简单的文本输入对话框。有任何简单的方法吗?


1
只需等待几个月,直到9月左右,您的生活就会轻松很多
乔纳森。

Answers:


265

在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(从XCode 4.2中的iPhone 5.0模拟器截取的屏幕截图):

警报设置为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];

这将产生以下警报:

使用UIAlertViewPlainTextInput alertStyle询问用户名的UIAlertView

您可以使用与我先前发布者相同的委托方法来处理输入的结果。我不确定是否可以阻止UIAlertView退出(没有shouldDismiss委托函数AFAIK),所以我想如果用户输入无效,则必须提出一个新警报(或仅重新show输入一次),直到输入正确为止。输入。

玩得开心!


1
使用自动引用计数,您不再需要自己保留和释放对象。
Waqleh 2015年

5
我知道,但是这个答案写在2011
。– Warkst,2015年

3
自IOS 9.0起不推荐使用该方法。改用UIAlertController:
EckhardN

如果您正在寻找Swift 4的支持,请访问:stackoverflow.com/a/10689318/525576
John Riselvato,

187

为确保您在用户输入文本后得到回调,请在配置处理程序内设置委托。 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的代码-保存多行代码。
戴夫·阿普尔顿2013年

那么,对于iOS7,这样做的正确方法是什么?我们正在使用iOS6 SDK进行构建,但在iOS7上仍然显示异常。
sebrock 2013年

为问题添加了iOS7支持
John Riselvato 2013年

1
发现我必须在我的alertView:(UIAlertView *) clickedButtonAtIndex:(NSInteger)buttonIndex委托方法中放置以下内容,以便获取textField.text的值:`NSString * theMessage = [alertView textFieldAtIndex:0] .text;`
James Perih 2013年

1
在swift代码中将“ 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,2012年

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

我只是想添加一条重要的信息,我相信这些信息可能是在那些寻求答案的人可能已经知道的假设下遗漏的。这个问题经常发生,当我尝试实施viewAlertUIAlertView消息按钮方法。为此,您需要首先添加可能类似于以下内容的委托类:

@interface YourViewController : UIViewController <UIAlertViewDelegate>

您也可以找到一个非常有用的教程 在这里

希望这可以帮助。


5

在UIViewController中尝试以下Swift代码-

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

我会UIAlertViewUITextField子视图中使用a 。您可以手动添加文本字段,也可以在iOS 5中使用新方法之一。


我从另一篇文章中添加了以下代码,但弹出窗口显示在屏幕外(非常多,仅底部可见)
user605957 2011年

2
codeUIAlertView * myAlertView = [[UIAlertView alloc] initWithTitle:@“您的标题在这里”消息:@“已覆盖”委托:self cancelButtonTitle:@“取消” otherButtonTitles:@“ OK”,无];UITextField * myTextField = [[UITextField alloc] 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 2011年

我尝试了类似的代码,它显示带有文本框和按钮的警报视图,但文本字段没有足够的空间,它卡在标题和按钮之间,并同时触摸它们。我尝试了一些变换来缩放框架,但是按钮保持在原处,因此也需要移动它们。我不知道如何重新放置按钮,而且我不认为所有这些对于从提示到用户的单行文本都是必需的。有没有比这更好的方法了?
院长戴维斯

2

这样向UIAlertView添加视图。在iOS 5中,有一些“神奇”的事情可以为您完成(但这一切都在NDA下)。


我试过了,它确实起作用。除非弹出窗口不在屏幕上(弹出窗口的上半部分被切掉)。有什么想法吗?
user605957 2011年

我遇到了同样的问题,删除了setTranformMakeTranslation(0,109)在ipad和iphone上为我修复的问题。没有它,它就会出现在正确的位置。
2011年

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];
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.