当另一个警报出现时,警报视图关闭

Posted

技术标签:

【中文标题】当另一个警报出现时,警报视图关闭【英文标题】:alertview closes when another alert appears 【发布时间】:2013-10-07 07:40:20 【问题描述】:
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"......" message:@"......" delegate:self cancelButtonTitle:@"Dismiss" otherButtonTitles:@"OK", nil];

[alert show];

我正在显示警报视图以使用警报视图的文本字段添加新类别,当用户点击警报的确定按钮时,我首先检查用户是否输入了任何内容,如果没有,则显示另一个带有一些的警报消息让用户知道文本字段是强制性的,但之前添加新类别的警报消失了。

我希望该警报留在屏幕上。 所以我该怎么做 ??

这是崩溃报告和代码::

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Add Vehicle Category" message:@"this gets covered!" delegate:self cancelButtonTitle:@"Dismiss" otherButtonTitles:@"OK", nil];
            alert.tag = 5;

txtAddVehicleCategory = [[UITextField alloc]initWithFrame:CGRectMake(12, 45, 260, 25)];

[txtAddVehicleCategory setBackgroundColor:[UIColor whiteColor]];

txtAddVehicleCategory.placeholder = @"Enter Vehicle Category";

txtAddVehicleCategory.contentVerticalAlignment =       UIControlContentVerticalAlignmentCenter;

[alert addSubview:txtAddVehicleCategory];


CGAffineTransform myTransform = CGAffineTransformMakeTranslation(0, -50);

[alert setTransform:myTransform];

[alert show];

'NSInvalidArgumentException',原因:'textFieldIndex (0) 超出了文本字段数组的范围'

【问题讨论】:

请注意,从 ios7 开始,此代码将不起作用。所以如果你打算提交到 AppStore,我会寻找更好的解决方案。 【参考方案1】:

当你想实现一些在UIAlertView 中输入文本的规则时,你应该禁用警报视图的OK 按钮,直到用户遵循这些规则。您可以使用UIAlertViewDelegate 方法实现此目的。查看alertViewShouldEnableFirstOtherButton:

从方法中返回NO,直到遵循规则

- (BOOL)alertViewShouldEnableFirstOtherButton:(UIAlertView *)alertView

    // When return NO, OK button is disabled.
    // When return YES, rule is followed and OK button gets enabled.
    return ([[[alertView textFieldAtIndex:0] text] length]>0)?YES:NO;


编辑

我提供的代码假设您使用的是默认警报视图样式文本字段,因此会崩溃。

您不应该将addSubview 改为UIAlertView,因为警报视图的视图层次结构是私有的。用户在UIAlertView 上添加的最新iOS7 will not display any subviews。所以我建议你不要这样做。

来自Apple docs,

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

改为使用UIAlertViewStyle

以下是支持的样式,

typedef enum 
   UIAlertViewStyleDefault = 0,
   UIAlertViewStyleSecureTextInput,
   UIAlertViewStylePlainTextInput,
   UIAlertViewStyleLoginAndPasswordInput
 UIAlertViewStyle;

使用适合您要求的那个。要验证用户输入的输入,请使用我建议的上述方法。请参阅 this simple guide/tutorial 以使用这些样式的警报视图。

希望有帮助!

【讨论】:

使用您的解决方案,当点击按钮打开警报视图时,我的应用程序会崩溃 @ParasGorasiya 在问题中添加您的代码和崩溃报告。 我已经更新了我的代码并添加了崩溃报告和调用警报的代码。 感谢您提供此信息,但由于某些要求,我无法使用此解决方案,因此请提供任何其他解决方案。 @ParasGorasiya 这是推荐的方式。但是,如果这不符合您的要求,您可以实现自定义警报视图,或使用任何开源。 TSAlertView、ios-custom-alertview 是几个选项。我仍然会强调不要在UIAlertView 上做addSubview

以上是关于当另一个警报出现时,警报视图关闭的主要内容,如果未能解决你的问题,请参考以下文章

即使出现警报也隐藏状态栏

Swift 中显示 UIAlertcontroller 时保持键盘打开?

警报视图没有确定/关闭按钮?

UIAlertView 更改 UITabbar 项目选定的颜色

在 UILocalNotification 中播放录制的音频

隐藏不同视图控制器的子视图