暂停循环并等待UIAlertView交互

时间:2014-01-02 15:53:00

标签: ios objective-c loops uialertview copy-paste

我有一个循环设置将文件复制到目录,但是,当目标文件已经存在时,UIAlertView会显示提示用户覆盖,跳过,取消等等。我的问题是,如何暂停循环直到UIAlertView被解除,此时将显示下一个(如果有的话)UIAlertView。

循环代码如下所示:

for (NSString *fileInArray in selectedFiles) {
    [self copyFile:fileInArray destination:[self.path stringByAppendingPathComponent:[fileInArray lastPathComponent]]];
}

路径作为NSStrings存储在NSArray中,NSArray是以另一种方法(复制/移动)创建的,这是粘贴方法。

这是粘贴文件的方法(用于复制功能)。

- (void) copyFile:(NSString *)input destination:(NSString *) output{



    NSFileManager *copyManager = [NSFileManager defaultManager];
    NSError *error;
    if ([copyManager fileExistsAtPath:output]){

            RIButtonItem *overwriteItem = [RIButtonItem itemWithLabel:@"Overwrite" action:^{
                NSError *removeError;
                [copyManager removeItemAtPath:output error:&removeError];
                if (removeError){
                    [self displayError:[NSString stringWithFormat:@"There was a problem overwriting the file '%@'. %@", [output lastPathComponent], [removeError localizedDescription]]];
                }
            }];
            RIButtonItem *cancelItem = [RIButtonItem itemWithLabel:@"Skip" action:^{

            }];

            RIButtonItem *renameItem = [RIButtonItem itemWithLabel:@"Rename" action:^{
            }];
            UIAlertView *fileExistsAlert = [[UIAlertView alloc] initWithTitle:@"Warning" message:@"A file already exists at the destination matching this file." cancelButtonItem:cancelItem otherButtonItems:overwriteItem, renameItem, nil];
            [fileExistsAlert show];
    }
    [copyManager copyItemAtPath:input toPath:output error:&error];
    if (error){
        [self displayError:[error localizedDescription]];
    }

目前,第一个UIAlertView显示大约1秒钟然后被隐藏,此时界面变为灰色,好像它被禁用并且不再出现UIAlertViews。使用最新的iOS SDK。

3 个答案:

答案 0 :(得分:0)

对于模式,你可以做这样的事情。您可以将下一个索引传递给复制函数,而不是基本循环。然后复制函数会使用下一个索引的performSelector afterDelay调用自身。如果警报显示它不会自行调用,则在警报被解除时将进行下一次调用。

答案 1 :(得分:0)

线索是推进runloop。但是虽然这很好,但是使用异步访问来摆脱循环。

有关示例,请参阅:Make iOS blocks execute synchronously

答案 2 :(得分:0)

当遇到类似的问题时,我决定创建一个函数来检查发生了哪些错误,将错误编译成数组,并使用一个UIALERTVIEW显示错误。您可以创建一个添加到包含有问题的文件/文件名的数组的函数,然后显示一个UIALERT VIEW,说明哪些文件无法上载/或重复。如果您在UIALERTVIEW中显示了大量文本,那么当UIALERTVIEW显示的文本多于它在UIALERTVIEW中的文本时,它就变得可滚动。