具有多个文本输入的 UIAlertView?

Posted

技术标签:

【中文标题】具有多个文本输入的 UIAlertView?【英文标题】:UIAlertView with multiple text inputs? 【发布时间】:2015-03-28 11:48:43 【问题描述】:
    UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Add new work order (TEST)" message:@"Please fill out all fields" delegate:self cancelButtonTitle:@"Add" otherButtonTitles: nil];
alert.alertViewStyle = UIAlertViewStylePlainTextInput;
UITextField *alertTextFieldName = [alert textFieldAtIndex:0];
alertTextFieldName.placeholder = @"Work order name";
alertTextFieldName.keyboardType = UIKeyboardTypeDefault;
UITextField *alertTextFieldProjectNo = [alert textFieldAtIndex:1];
alertTextFieldProjectNo.placeholder = @"ProjectNo";
alertTextFieldProjectNo.keyboardType = UIKeyboardTypeDefault;
UITextField *alertTextFieldSubName = [alert textFieldAtIndex:2];
alertTextFieldSubName.placeholder = @"Sub account name";
alertTextFieldSubName.keyboardType = UIKeyboardTypeDefault;
[alert show];

我正在尝试执行此操作,但出现错误:NSRangeException',原因:'*** -[__NSArrayM objectAtIndex:]: index 1 beyond bounds [0 .. 0]'

难道我不能向 aletView 添加多个文本字段吗? -textFieldAtIndex: 给我它可能的概念。我错了吗?

【问题讨论】:

这个link可以帮到你 UIAlertView 在 ios 8 中已弃用。最好使用 UIAlertController。 我不认为使用 UIAlertView 可以使用超过 2 个文本字段,但从 iOS8 开始,您可以使用可以接受超过 2 个的 UIAlertViewController 【参考方案1】:

使用此代码在UIAlertView 中添加多个文本字段

UIView *v = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 250, 100)];

UITextField *textField1 = [[UITextField alloc] initWithFrame:CGRectMake(10,0,252,25)];
textField1.borderStyle = UITextBorderStyleRoundedRect;
textField1.placeholder = @"Username";
textField1.keyboardAppearance = UIKeyboardAppearanceAlert;
textField1.delegate = self;
[v addSubview:textField1];

UITextField *textField2 = [[UITextField alloc] initWithFrame:CGRectMake(10,30,252,25)];
textField2.placeholder = @"Password";
textField2.borderStyle = UITextBorderStyleRoundedRect;
textField2.keyboardAppearance = UIKeyboardAppearanceAlert;
textField2.delegate = self;
[v addSubview:textField2];


UITextField *textField3 = [[UITextField alloc] initWithFrame:CGRectMake(10,60,252,25)];
textField3.placeholder = @"Address";
textField3.borderStyle = UITextBorderStyleRoundedRect;
textField3.keyboardAppearance = UIKeyboardAppearanceAlert;
textField3.delegate = self;
[v addSubview:textField3];


UIAlertView *av = [[UIAlertView alloc] initWithTitle:@"TEST" message:@"" delegate:nil cancelButtonTitle:@"NO" otherButtonTitles:@"YES", nil];
[av setValue:v  forKey:@"accessoryView"];
[av show];

希望这段代码对你有用。

【讨论】:

我不知道为什么有人对你的答案投了反对票而没有发表评论并详细说明什么是更好的解决方案。同时,如果我想从 uialertview 委托方法 clickedButtonAtIndex: 检索它们的值,我应该将文本字段作为属性吗? 是的,这是可能的。您想创建 3 个文本字段全局变量,然后您将能够从文本字段中获取值。 如何获得这个动作?索引处的单击按钮,或者关闭不起作用。【参考方案2】:

我认为这个thread 会很有用。 如果您只需要两个字段,请继续使用 UIAlertViewStyleLoginAndPasswordInput。 否则,为您的逻辑提供您自己的子视图。

附: textFieldAtIndex 方法可用于接收已经存在的文本字段,但您正在尝试接收尚不存在的字段。

【讨论】:

我不确定 textFieldAtIndex 应该如何工作,因为 textFieldatIndex: 0 指的是警报文本字段。那么我如何在 index:1 获得一个呢?似乎它会形成警报视图 @DevilInDisguise 是的,当然它应该从 UIAlertView 返回文本字段。我不确定,但我认为可以通过此方法返回的文本字段是由 UIAlertView 本身 创建的,但您可以使用 UIAlertViewStyle 控制这些字段。从样式枚举中我们可以看出,没有太多选择。已经有另一个答案,使用 accessoryView 键,我认为您应该尝试一下。其实等于添加自己的子视图。

以上是关于具有多个文本输入的 UIAlertView?的主要内容,如果未能解决你的问题,请参考以下文章

多个错误显示在同一个 UIAlertView

UIAlertView设置文本输入框格式

我可以在 ios 的警报框中放置多个文本框吗?

用于自定义视图的 iOS7 UIAlertView 样式对话框

UIAlertView 文本字段捕获 onchange

为啥在我的视图被推送到导航堆栈之前我的 UIAlertView 没有在屏幕上消失?