UITableView更新行选择的数据

时间:2014-08-13 09:41:52

标签: ios objective-c uitableview

我有一个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);
                }
            }];
}

问题是namenewFileName具有相同的值name,这导致NSFileManager错误地说该文件已存在。

我尝试删除[nameField setText:name],但问题仍然存在。

我运气不好,无法找到问题,非常感谢您的帮助。

1 个答案:

答案 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