带有 UITextFields 和 UITextViews 的自定义 UIAlertView

Posted

技术标签:

【中文标题】带有 UITextFields 和 UITextViews 的自定义 UIAlertView【英文标题】:custom UIAlertView with UITextFields and UITextViews 【发布时间】:2012-12-02 13:47:28 【问题描述】:

我想制作一个UIAlertView,其中有一个UITextFieldUITextView 显示大约5-6 行。我尝试创建视图并将其添加为子视图,但它与警报视图的按钮重叠。在调整警报视图的大小时,按钮不会向下移动。我还需要为它设置不同的背景和东西。那就是我需要制作一个自定义警报视图。我是 iPhone 编程的新手。请提供一种方法。

【问题讨论】:

或者,只需创建一个完全按照您喜欢的方式定制的模态视图...... 【参考方案1】:

您确实无法制作自定义警报视图,因为 Apple 已决定这是他们不希望我们搞砸的东西。如果您可以在警报中只使用一个文本字段和股票背景颜色,您可以使用setAlertViewStyle:UIAlertViewStylePlainTextInput 将文本字段放入警报中。

UIAlertView *myAlertView = [[UIAlertView alloc] initWithTitle:@"Title" message:@"Message" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:nil, nil];
[myAlertView setAlertViewStyle:UIAlertViewStylePlainTextInput];
[myAlertView show];

但是,如果您确实想要进行这些更改,则必须使用 UIView 自己制作并修饰它,使其看起来像一个警报视图。这是一个粗略的例子:

- (IBAction)customAlert:(UIButton *)sender

    UIView *myCustomView = [[UIView alloc] initWithFrame:CGRectMake(20, 100, 280, 300)];
    [myCustomView setBackgroundColor:[UIColor colorWithRed:0.9f green:0.0f blue:0.0f alpha:0.8f]];
    [myCustomView setAlpha:0.0f];

    UIButton *dismissButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [dismissButton addTarget:self action:@selector(dismissCustomView:) forControlEvents:UIControlEventTouchUpInside];
    [dismissButton setTitle:@"Close" forState:UIControlStateNormal];
    [dismissButton setFrame:CGRectMake(20, 250, 240, 40)];
    [myCustomView addSubview:dismissButton];

    UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(20, 20, 240, 35)];
    [textField setBorderStyle:UITextBorderStyleRoundedRect];
    [myCustomView addSubview:textField];

    UITextView *textView = [[UITextView alloc] initWithFrame:CGRectMake(20, 75, 240, 150)];
    [myCustomView addSubview:textView];

    [self.view addSubview:myCustomView];

    [UIView animateWithDuration:0.2f animations:^
        [myCustomView setAlpha:1.0f];
    ];


- (void)dismissCustomView:(UIButton *)sender

    [UIView animateWithDuration:0.2f animations:^
        [sender.superview setAlpha:0.0f];
    completion:^(BOOL done)
        [sender.superview removeFromSuperview];
    ];

【讨论】:

【参考方案2】:

做同样的事情,为了将按钮向下移动,使用多个 '\n' 字符作为消息文本。

例如:

UIAlertView *alert = [[UIAlertView alloc]
        initWithTitle: @"Your title"
        message: @"\n\n\n\n\n\n\n\n\n\n"
        delegate: nil
        cancelButtonTitle:@"OK"
        otherButtonTitles:nil];
[alert show];
[alert release];

【讨论】:

【参考方案3】:

对于警告消息文本,只需添加一堆换行符,如下所示:

@"The alert message.\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"

【讨论】:

【参考方案4】:

嗯,最好的方法是创建一个类,它是UIAlertView 的子类,但UIAlertViewclass 参考说 UIAlertView 类旨在按原样使用,不支持子类化。此类的视图层次结构是私有的,不得修改。

我需要创建一个弹出式登录已经有一段时间了,我关注了这个tutorial。它非常有用,然后我读过一些帖子,人们抱怨他们的应用程序被拒绝,因为使用了UIAlertView 的子类。有趣的是,当时 youtube 应用程序使用了一个弹出登录控件,看起来他们使用了 UIAlertView 的子类,但也许他们从头开始创建了 UIView 的子类。我认为值得一试。

【讨论】:

以上是关于带有 UITextFields 和 UITextViews 的自定义 UIAlertView的主要内容,如果未能解决你的问题,请参考以下文章

UIView、UIScrollView 和 UITextFields 问题调用方法

通过 UITextFields 约束问题交换

从 UITableViewCells 更新 UITextFields 而无需重新加载数据

UITableView滚动后UITextFields重叠

没有按钮操作的多个 UITextfields 的总和

将文本输入到包含 UITextFields 的 UITableView 单元格时的键盘控制