0

我使用以下代码创建了一个UIAlertView并在其上添加了一些组件,但结果在图像上:(((图像在这里:http: //i.stack.imgur.com/DTg02.png

-(IBAction)login:(id)sender
{
    UIAlertView *login = [[UIAlertView alloc]initWithTitle: @"Login first"
                                                   message:@"enter username and password please first" delegate:self cancelButtonTitle:@"cancel"otherButtonTitles:@"OK", nil];

k = [[UITextField alloc] initWithFrame:CGRectMake(20.0, 70.0, 200.0, 25.0)]; //<< it also displays wrong without this line
k.text = @"";
k.backgroundColor = [UIColor whiteColor];
k.clearButtonMode= UITextFieldViewModeWhileEditing;
k.keyboardType = UIKeyboardTypeAlphabet;
k.keyboardAppearance = UIKeyboardAppearanceAlert;

p = [[UITextField alloc] initWithFrame:CGRectMake(20.0, 100.0, 200.0, 25.0)];
p.text = @"";
p.backgroundColor = [UIColor whiteColor];
p.clearButtonMode = UITextFieldViewModeWhileEditing;
p.keyboardType = UIKeyboardTypeAlphabet;
p.keyboardAppearance = UIKeyboardAppearanceAlert;

[login addSubview:k];
[login addSubview:p];
[login show];
}
4

4 回答 4

2

如果要在 UIAlertView 上添加多个 textField 和 Multiple Button,请按照以下步骤操作:

步骤1 :

@interface ViewController ()<UIAlertViewDelegate>
{
    UITextField *textFieldOne,*textFieldTwo,*textFieldThird;
} 

第2步 :

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Alert" message:@"Multiple TextField" delegate:nil cancelButtonTitle:@"NO" otherButtonTitles:@"YES", nil];

    [alert addButtonWithTitle:@"CANCEL"];
     alert.delegate=self;

    UIView *myView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
    textFieldOne=[[UITextField alloc]initWithFrame:CGRectMake(5, 0, 150, 20)];
    [textFieldOne setPlaceholder:@"First Name"];
    [myView addSubview:textFieldOne];

    textFieldTwo=[[UITextField alloc]initWithFrame:CGRectMake(5,25, 150, 20)];
    [textFieldTwo setPlaceholder:@"Middle Name"];
    [myView addSubview:textFieldTwo];

    textFieldThird=[[UITextField alloc]initWithFrame:CGRectMake(5,50, 150, 20)];
    [textFieldThird setPlaceholder:@"Last Name"];
    [myView addSubview:textFieldThird];

    [alert setValue:myView forKey:@"accessoryView"];
    [alert show];

第 3 步:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    NSString *title = [alertView buttonTitleAtIndex:buttonIndex];

    if([title isEqualToString:@"YES"])
    {
        NSLog(@"Button YES");
        NSLog(@"TextFiledOne Text = %@",textFieldOne.text);
        NSLog(@"TextFiledTwo Text = %@",textFieldTwo.text);
        NSLog(@"TextFiledThree Text = %@",textFieldThird.text);
    }
    else if([title isEqualToString:@"NO"])
    {
        NSLog(@"Button NO");
    }
    else
    {
        NSLog(@"Cancel is click");
    }
}
于 2015-06-11T06:14:57.093 回答
0

AUIAlertView不考虑额外的文本输入。您可以改用 a UIActionSheet,因为它在这里解释。

于 2013-04-20T14:10:16.017 回答
0

不要去虚张声势。只需使用以下代码:

[login setAlertViewStyle:UIAlertViewStyleLoginAndPasswordInput];

并处理用户的输入,使用这个:

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    if([[alertView textFieldAtIndex:0].text isEqual:@"UserName"]&&[[alertView textFieldAtIndex:1].text isEqual:@"PassWord"])
    {
        //do your stuff here
        [adminLoginButton setTitle:@"Logout" forState:UIControlStateNormal];
        [adminLoginButton setImage:[UIImage imageNamed:@"Logout.png"] forState:UIControlStateNormal];
    }
    else
    {
        UIAlertView *errorMessage = [[UIAlertView alloc]initWithTitle:@"Authentication Error" message:@"Input is wrong" delegate:self cancelButtonTitle:@"Okay" otherButtonTitles: nil];
        [errorMessage show];
    }
}
于 2013-08-06T09:00:29.283 回答
0

添加到这里已经添加的代码是没有意义的,因为它已经足够好,并且给出了一些好的替代方案。我要做的是告诉你为什么不应该将自己的UITextFields 添加到UIAlertViewusing 中addSubview:

基本上,Apple 已经制作了UIAlertView要使用的类,as is并且该类的视图层次结构是私有的。

子类化注释

UIAlertView 类旨在按原样使用,不支持子类化。此类的视图层次结构是私有的,不得修改。

取自UIAlertViewApple 文档的子类化注释。

本质上,这意味着如果您addSubview:在 a 上使用该方法,UIAlertView那么您实质上是在更改 Apple 指示为私有的内容,并且您的应用程序将被 Apple App Review Process 拒绝,因为规则2.5

2.5 使用非公开 API 的应用将被拒绝

您可能会问自己,为什么这种方法甚至UIAlertView肯定存在,因为我们可以使用它。,它存在的原因是因为该类UIAlertView本身是声明方法的子UIViewaddSubview:。不幸的是,没有理由阻止一个实例UIAlertView实际调用该方法。因此,Apple 所做的是他们重写了该addSubview:方法,它所做的只是返回。所以这个方法让它什么都不做,你传递给这个方法的任何视图都不会被添加,因为它从不调用[super addSubview:view];.

因此,当涉及到UIAlertViews 时,有两件事是你不应该做的,它们是:

  1. UIAlertView像这样的子@interface MYAlertView : UIAlertView是子类化,是不允许的。

  2. 更改视图层次结构,如[alertView addSubview:view];

但是,我应该指出一点,虽然我们不允许子类化,UIAlertView但我们仍然可以为它创建类别,@interface UIAlertView (MyCategory)因为这不是子类化,它被称为类类别或类扩展(我也听说过它之前调用了一个类提供者)。

还应该注意的是,如果您正在为iOS8及以上开发,您应该使用UIAlertControllerUIAlertView被弃用的。

重要的:

UIAlertView 在 iOS 8 中已弃用。(请注意,UIAlertViewDelegate 也已弃用。)要在 iOS 8 及更高版本中创建和管理警报,请改用 UIAlertController 和 UIAlertControllerStyleAlert 的首选样式。

因此,我要么使用其他答案中提到的自定义类之一,要么继续使用UIAlertController,或者如果您有时间制作自己的自定义警报视图。

我希望这个解释能帮助你UIAlertView更多地理解。

于 2015-06-11T07:29:26.620 回答