如何移动UIAlertView中的按钮为插入的UITextField腾出空间?

问题描述 投票:7回答:8

[编辑]嗯。也许这个问题应该标题为“CocoaTouch中调用的默认用户输入对话框视图是什么?”我意识到我可以创建一个完全符合我想要的视图,并将其包装在视图控制器和presentModalView中 - 但我有点希望有一个标准的,普通的用户输入“对话框”视图 - 与Cocoa-touch。 “输入您的姓名”,“输入要搜索的文字”等,都是非常常见的事情!

无论如何......这是我最初提出的问题:

这段代码:

UIAlertView* find = [[UIAlertView alloc] init];
[find setDelegate:self];
[find setTitle:@"Find"];

[find addButtonWithTitle:@"Cancel"];
[find addButtonWithTitle:@"Find & Bring"];
[find addButtonWithTitle:@"Find & Go"];
[find addButtonWithTitle:@"Go To Next"];

[find addSubview:_findText];

CGRect frm = find.frame;
int height = frm.size.height + _findText.frame.size.height + 100; // note how even 100 has no effect.
[find setFrame:CGRectMake(frm.origin.x, frm.origin.y, frm.size.width, height)];

[find setNeedsLayout];
[find show];
[find release];

生成此警报视图:

Find Alert http://www.publicplayground.com/IMGs/Misc/FindAlert.png

(我从this question by emi1Faber的代码开始,它的工作方式与广告一样;但是,正如我在评论中所述,取消按钮覆盖了文本字段。)

如何重新调整所有内容以使文本字段正确匹配? [findAlert setNeedsLayout]似乎没有做任何事情,即使在我[findAlert setFrame:tallerFrame]之后。提示?

谢谢!

cocoa-touch
8个回答
25
投票

向下移动文本视图最简单(也是最正确的方法)是添加消息

[find setMessage:@"\n"];

此外,框架未生效的原因是-show在开始动画之前设置框架并创建视图层次结构。您还应该使文本视图成为第一个响应者,以便弹出键盘。

完整示例:

// Create Alert
UIAlertView* av = [UIAlertView new];
av.title = @"Find";
// Add Buttons
[av addButtonWithTitle:@"Cancel"];
[av addButtonWithTitle:@"Find & Bring"];
[av addButtonWithTitle:@"Find & Go"];
[av addButtonWithTitle:@"Go to Next"];
// Make Space for Text View
av.message = @"\n";
// Have Alert View create its view heirarchy, set its frame and begin bounce animation
[av show];
// Adjust the frame
CGRect frame = av.frame;
frame.origin.y -= 100.0f;
av.frame = frame;
// Add Text Field
UITextField* text = [[UITextField alloc] initWithFrame:CGRectMake(20.0, 45.0, 245.0, 25.0)];
text.borderStyle = UITextBorderStyleRoundedRect;
[av addSubview:text];
[text becomeFirstResponder];

注意:您也可以修改UIAlertView的子视图,但是由于Apple已经更改了UIAlertView布局,因此在设置新的布局之前应该检查其类描述和框架与已知值。你甚至可以得到这样的东西:

Preview (来源:booleanmagic.com


6
投票

即使你能够实现这一点,它也不会非常像iPhone-y。 UIAlertView真的不是为这样的用户输入而设计的。如果您查看所有Apple应用程序,您会看到他们使用的是使用presentModalViewController:UIViewController方法显示的新视图。

编辑:这个建议不再像我写的那样真实。 Apple越来越多地使用警报视图作为文本输入框,而iOS5甚至包括本机支持,而不必混淆视图(查看alertViewStyle属性)。

我想也许你需要有四个按钮然后使用自定义UIViewController可能仍然是正确的方法。但是如果你只想用OK / Cancel按钮输入密码,那就没关系了。


3
投票

Zoul提出了最好的方法,捕获用户输入就行了:

a)将UITextFieldDelegate协议添加到您的类中。

b)做类似的事情

    UIAlertView *insertScore = [UIAlertView new];
    [insertScore setDelegate:self];
    [insertScore setTitle:@"New Title!"];
    [insertScore addButtonWithTitle:@"Cancel"];
    [insertScore addButtonWithTitle:@"Ok"];

    insertScore.message = @"\n";

    [insertScore addTextFieldWithValue:@"Input" label:@"player"];

    [[insertScore textField] setDelegate:self];

    [insertScore show]; 

    [insertScore release];

c)关键部分是将textField的委托设置为self,然后访问数据,您可以简单地:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 
{
  NSLog(@"%@",[[alertView textField] text]);
}

希望这对某人有所帮助,因为我必须考虑一下才能做到正确。


1
投票

最有可能你想看看addTextFieldWithValueUIAlertView方法?在您的类顶部的某处添加以下代码:

@interface UIAlertView ()
- (void) addTextFieldWithValue: (NSString*) val label: (NSString*) label;
- (UITextField*) textField;
@end

这不是官方的,但是恕我直言,它并没有让你从App商店中被拒绝,而且它比将文本域黑客攻击到自己的对话框要好得多。


1
投票

解释如何设置列数,尚未测试。

http://iloveco.de/uikit-alert-types/

但是有一个私有方法setNumberOfRows:(int)n,它允许你设置显示按钮的最大行数。要使用这个方法,我们需要在UIAlertView类中添加我们自己的添加。我们通过在.m文件中为UIAlertView添加@interface来实现此目的。

// extend the UIAlertView class to remove the warning caused
// by calling setNumberOfRows.
@interface UIAlertView (extended)
- (void) setNumberOfRows:(int)num;
@end

这将允许我们在没有编译器向我们发出警告的情况下调用该方法。

[myAlert setNumberOfRows:2];

0
投票

尝试在UIAlertView初始化中输入标题之后的某些(\ n)s。那将推下按钮。我同意斯蒂芬的观点。如果应用程序以不应该使用的方式使用控件,Apple可能会拒绝该应用程序。 (人机界面指南中有一些关于此的条款!)


0
投票

这个更简单的方法适合我:

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"UIAlertView"
    message:@"<Alert message>" delegate:self cancelButtonTitle:@"OK"
    otherButtonTitles:nil];
[alert addTextFieldWithValue:@"" label:@"Text Field"];

希望有所帮助。哦,如果你需要多个按钮行,那么它是:

[alert setNumberOfRows:3];

干杯


0
投票

https://github.com/TomSwift/TSAlertView

这个库实际上是从头开始创建控件而不是试图破解UIAlertView,这通常是Bad Plan(TM)

© www.soinside.com 2019 - 2024. All rights reserved.