我有一个UITableView
从数组中获取数据,数组包含目录的文件名。
我试图让用户在行选择上编辑文件名。
我的代码是:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[self editChattWithName:[self.listArray objectAtIndex:indexPath.row] atIndex:indexPath];
[self.tabView deselectRowAtIndexPath:indexPath animated:YES];
}
- (void)editChattWithName:(NSString*)name atIndex:(NSIndexPath *)indexPath {
UIAlertView* editAlert = [[UIAlertView alloc]
initWithTitle:nil
message:@"Edit FileName"
delegate:self
cancelButtonTitle:@"Cancel"
otherButtonTitles:@"Update", nil];
[editAlert setAlertViewStyle:UIAlertViewStylePlainTextInput];
UITextField* nameField = [editAlert textFieldAtIndex:0];
[nameField setPlaceholder:@"New FileName"];
[nameField setText:name];
[editAlert show];
[editAlert release];
NSString *newFileName = nameField.text;
[editAlert showWithCompletion:^(UIAlertView *alertView, NSInteger buttonIndex) {
if (buttonIndex == 0) { }
else if (buttonIndex == 1) {
NSError *error;
// Edit filename inside directory
[fm moveItemAtPath:[NSString stringWithFormat:@"%@%@",directory,name] toPath:[NSString stringWithFormat:@"%@%@",directory,newFileName] error:&error];
// Update value inside array
[self.listArray replaceObjectAtIndex:indexPath.row withObject:newChatName];
// reload table data to show new filename
[self.tabView reloadData];
NSLog(@"Old Filename: %@%@",directory,name);
NSLog(@"New Filename: %@%@",directory,newFileName);
NSLog(@"Error: %@",error);
}
}];
}
问题是name
和newFileName
具有相同的值name
,这导致NSFileManager错误地说该文件已存在。
我尝试删除[nameField setText:name]
,但问题仍然存在。
我运气不好,无法找到问题,非常感谢您的帮助。
答案 0 :(得分:1)
好吧,如果您已经知道方法moveItemAtPath:toPath:
仅在旧文件名和新文件名相同的情况下导致错误,则应该很容易发现此错误:
if (![newFileName isEqualToString:name]) {
[fm moveItemAtPath:[NSString stringWithFormat:@"%@%@",directory,name] toPath:[NSString stringWithFormat:@"%@%@",directory,newFileName] error:&error];
}
现在,只有当新文件名与旧名称不同时,您的文件才会被移动(即重命名)。
修改强>
此外,如果您想获取用户刚刚在警报视图中输入的新文件名,您应该输入以下内容:
NSString *newFileName = nameField.text;
在你的完成块中。否则,它将在首次显示警报视图时设置,因此具有其初始值。把它们放在一起:
[editAlert showWithCompletion:^(UIAlertView *alertView, NSInteger buttonIndex) {
if (buttonIndex == 1) {
NSString *newFileName = nameField.text;
NSError *error;
// Edit filename inside directory
if (![newFileName isEqualToString:name]) {
[fm moveItemAtPath:[NSString stringWithFormat:@"%@%@",directory,name] toPath:[NSString stringWithFormat:@"%@%@",directory,newFileName] error:&error];
}
// Update value inside array
[self.listArray replaceObjectAtIndex:indexPath.row withObject:newChatName];
// reload table data to show new filename
[self.tabView reloadData];
}
}];
<强>补充:强>
为了不混淆其他用户,应注意showWithCompletion:
不原生UIAlertView
方法。已创建Objective-C类别以使用此方法扩展UIAlertView
。可以找到一个示例here。