UIAlertView显示文本框和按钮

时间:2013-04-20 10:13:29

标签: uialertview

我使用以下代码创建UIAlertView并在其上添加一些组件,但结果位于图片上:(((image is here: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 个答案:

答案 0 :(得分: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");
    }
}

答案 1 :(得分:0)

没有考虑额外的文字输入UIAlertView。您可以使用UIActionSheet来解释here

答案 2 :(得分: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];
    }
}

答案 3 :(得分:0)

没有必要添加已经添加到此处的代码,因为它已经足够好并且有一些很好的替代方案。我要做的是告诉您为什么不应该使用UITextField将自己的UIAlertView添加到addSubview:

基本上Apple已经使用UIAlertViewas is,并且此类的视图层次结构是私有的。

  

子类注释

     

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

UIAlertView Apple documentation获取的子类注释。

从本质上讲,这意味着如果你在addSubview:上使用UIAlertView方法,那么你实质上是在修改Apple所说的私有内容,而你的应用会被苹果拒绝规则 2.5 的应用审核流程。

  

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

你可能会问自己,为什么这种方法甚至存在于UIAlertView,因为我们可以使用它。那么 NO 原因是因为UIAlertView类本身是UIView的子类,而addSubview:方法是声明的UIAlertView方法。不幸的是,没有理由阻止实际调用该方法的addSubview:实例。所以Apple所做的是他们已经覆盖了[super addSubview:view];方法,它所做的就是返回。因此,此方法不会执行任何操作,并且您传递给此方法的任何视图都将永远不会被添加,因为它从不调用UIAlertView

所以当谈到UIAlertView时,你不应该做两件事,这些是:

  1. 子类 @interface MYAlertView : UIAlertView,如[alertView addSubview:view];这是子类化,不允许。

  2. 更改视图层次结构,例如UIAlertView

  3. 然而,我应该提出一点,虽然我们不允许继承@interface UIAlertView (MyCategory),我们仍然可以像iOS8一样为它制作类别,因为它不被归类为子类化它是已知的作为类类别或类扩展(我之前也听说它叫做类提供者)。

    还应注意,如果您正在为UIAlertController及更高版本进行开发,则应使用UIAlertView,因为UIAlertController已被弃用。

      

    重要:

         

    UIAlertView在iOS 8中已弃用。(请注意,UIAlertViewDelegate也已弃用。)要在iOS 8及更高版本中创建和管理警报,请使用UIAlertController,其优先级为UIAlertControllerStyleAlert。

    因此,我要么使用其他答案中提到的其中一个自定义类,要么使用UIAlertView或者如果您有时间制作自己的自定义提醒视图。

    我希望这个解释可以帮助您更好地理解UNION ALL