iphone - 输入文本时在 UIAlertView 中启用按钮 - 多个警报 View

标签 iphone objective-c ios

在我的应用程序中,当用户单击工具栏中的保存按钮时,系统会通过 UIAlertView 提示用户选择保存当前工作的方式,即选择保存为图像还是保存为播放。当用户选择保存为剧本时,他们会收到第二个 UIAlertView 的提示,该 View 还有一个文本字段供他们插入剧本的名称。我想要实现的是,当没有输入文本时,“确定”按钮被禁用,并且当输入的文本长度为 1 或更多时,文件就可以保存(使用存档器,这可以正常工作所以这不是问题),然后启用“确定”按钮。下面列出的是显示两个警报 View 的代码,以及从 View 中选择不同项目时发生的情况。

- (IBAction)selectSaveType {
UIAlertView *message = [[UIAlertView alloc] initWithTitle:@""
                                                  message:@"Please Select an Option."
                                                 delegate:self
                                        cancelButtonTitle:@"Save Play"
                                        otherButtonTitles:@"Save to Photos", nil];
[message show];

}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
NSString *title = [alertView buttonTitleAtIndex:buttonIndex];
if([title isEqualToString:@"Save Play"])
{
    NSLog(@"Save Play was selected.");
    [self GetFileName];
}
else if([title isEqualToString:@"Save to Photos"])
{
    NSLog(@"Save To Photos was selected.");
    //here is where we need to find how to call saveDrawing.
    [self saveDrawing];

}
else if([title isEqualToString:@"Ok"])
{
    NSLog(@"OK selected");
    UITextField *fName= [alertView textFieldAtIndex:0];
    NSString *NameFile = fName.text;
    [self savePlay:NameFile];


}

}

-(void)savePlay:(NSMutableString *)fileName{
//code here to save via archive.
   NSArray *pathforsave = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
   NSString *documentDirectory = [pathforsave objectAtIndex:0];
    //here we need to add the file extension onto the file name before we add the name to the path
   [fileName appendString:@".hmat"];
   NSString *strFile = [documentDirectory stringByAppendingPathComponent:fileName];
[NSKeyedArchiver archiveRootObject:matView.drawables toFile:strFile];

}

我一直在尝试使用下面的代码来处理这个问题,但是当第一个 UIAlertView 触发时(这是要求选择一个播放 - 没有文本字段存在) - 然后运行下面的函数并使应用程序崩溃,因为第一个警报 View 中没有文本字段。

- (BOOL)alertViewShouldEnableFirstOtherButton:(UIAlertView *)alertView
{
NSString *inputText = [[alertView textFieldAtIndex:0] text];
if( [inputText length] >= 1 )
{
    return YES;
}
else
{
    return NO;
}
}

当第一个警报触发时,alertViewShouldEnableFirstOtherButton 被击中,然后我的应用程序在模拟器中崩溃。有谁知道为什么会这样?两件事我不太确定

一 - 为什么在第二个警报 View 上为播放命名的确定按钮的句柄是在处理其他按钮的同一 block 中处理的。由于它是一个单独的警报 View ,它不应该在自己的 block 中吗?

二 - 为什么 alertViewShouldEnableFirstOtherButton 在尚未到达第二个警报 View 时被点击,它被调用并与第一个警报 View 一起运行,这会导致应用程序崩溃。

感谢您的帮助,我是 Objective-C 的新手。

最佳答案

警报 View 的委托(delegate)方法将被您呈现的任何警报 View 调用。也就是说,这段代码会崩溃,因为 textFieldAtIndex:0 在普通警报 View 中不存在。要解决此问题,您需要做的就是将 if 语句添加到委托(delegate)方法中,以确定哪个警报调用了该操作。

编辑:不再按名称标识警报。代码现在检查委托(delegate)发件人的样式。

  - (BOOL)alertViewShouldEnableFirstOtherButton:(UIAlertView *)alertView
{
    if (alertView.alertViewStyle == UIAlertViewStylePlainTextInput) {
        if([[[alertView textFieldAtIndex:0] text] length] >= 1 )
        {
            return YES;
        }
        else
        {
            return NO;
        }
    }else{
        return YES;
    }
}

关于iphone - 输入文本时在 UIAlertView 中启用按钮 - 多个警报 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12712438/

相关文章:

objective-c - 多语言应用程序和 .string 文件

iphone - 使用数据库时在后台任务中更新 SQLite DB 的最佳策略

ios - 是否可以使用 UITableViewStylePlain 禁用 UITableView 中的 float 标题?

iphone - UISearchDisplayController 未显示

c++ - 如何在 Objective C (Xcode) 中使用 C、C++ 程序或类?

ios - 在容器 View 中显示 CNContactPickerViewController?

iphone - iPhone 开发的最低规范笔记本电脑?

objective-c - 如何将新的类文件关联为特定场景的 View Controller ?

iOS 自动布局问题 - 即使没有约束 subview 也会错位

objective-c - 动画在设备上延迟