我有一个循环设置将文件复制到目录,但是,当目标文件已经存在时,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。
答案 0 :(得分:0)
对于模式,你可以做这样的事情。您可以将下一个索引传递给复制函数,而不是基本循环。然后复制函数会使用下一个索引的performSelector afterDelay调用自身。如果警报显示它不会自行调用,则在警报被解除时将进行下一次调用。
答案 1 :(得分:0)
线索是推进runloop。但是虽然这很好,但是使用异步访问来摆脱循环。
答案 2 :(得分:0)
当遇到类似的问题时,我决定创建一个函数来检查发生了哪些错误,将错误编译成数组,并使用一个UIALERTVIEW显示错误。您可以创建一个添加到包含有问题的文件/文件名的数组的函数,然后显示一个UIALERT VIEW,说明哪些文件无法上载/或重复。如果您在UIALERTVIEW中显示了大量文本,那么当UIALERTVIEW显示的文本多于它在UIALERTVIEW中的文本时,它就变得可滚动。