如何使用用户输入

时间:2016-04-12 14:54:34

标签: ios objective-c uitableview

self.alphabets是我的数据源,包含所有字母表。

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{    [tableView beginUpdates];
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        [self.alphabets removeObjectAtIndex:indexPath.row];
        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath, nil] withRowAnimation:UITableViewRowAnimationFade];
    }
    if (editingStyle == UITableViewCellEditingStyleInsert) {

        [self.alphabets insertObject:[self.alphabets objectAtIndex:indexPath.row] atIndex:[self.alphabets count]-1];

        NSIndexPath * path1 = [NSIndexPath indexPathForRow:indexPath.row inSection:0];

        NSArray * index = [NSArray arrayWithObjects:path1, nil];

        [self.tableView insertRowsAtIndexPaths:index withRowAnimation:UITableViewRowAnimationAutomatic];
    }
    [tableView endUpdates];
    NSLog(@"%@",self.alphabets);
}

这是代码,我用来通过使用已存在的数据在tableview中添加或插入行/单元格。

但我想通过获取用户输入来添加或插入新的行/单元格。怎么做。

我试过使用UIAlertController。这是一种正确的方法吗?但我失败了。有人请帮助我。

另外,我对一次插入多行感到疑惑。如何实现它。

以下是我用来一次插入多行的代码。

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
    {  
        [tableView beginUpdates];
        if (editingStyle == UITableViewCellEditingStyleInsert) {

                [self.alphabets insertObject:[self.alphabets objectAtIndex:indexPath.row] atIndex:[     self.alphabets count]-1];

                NSIndexPath * path1 = [NSIndexPath indexPathForRow:indexPath.row inSection:0];
                NSIndexPath * path2 = [NSIndexPath indexPathForRow:indexPath.row+1 inSection:0];

                NSArray * index = [NSArray arrayWithObjects:path1,path2, nil];

                [self.tableView insertRowsAtIndexPaths:index                withRowAnimation:UITableViewRowAnimationAutomatic];
                }
                [tableView endUpdates];
                NSLog(@"%@",self.alphabets);
    }

这是我得到的例外。

***由于未捕获的异常终止应用程序' NSInternalInconsistencyException',原因:'无效更新:第0部分中的行数无效。更新后现有部分中包含的行数(11)必须等于更新前的该部分中包含的行数(10),加上或减去从该部分插入或删除的行数(插入2个,删除0个)和加上或减去行数移入或移出该部分(0移入,0移出)。'

1 个答案:

答案 0 :(得分:0)

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (editingStyle == UITableViewCellEditingStyleInsert) {

    UIAlertController * alert = [UIAlertController alertControllerWithTitle:@"Inserting a new row" message:@"Enter text below to add it to table view" preferredStyle:UIAlertControllerStyleAlert];

    [alert addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {
    }];

    UIAlertAction * ok = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
        NSArray * tfArray = alert.textFields;
        UITextField * tf = [tfArray objectAtIndex:0];
        self.userInput = tf.text;
        NSLog(@"%@",self.userInput);
        [self.alphabets insertObject:self.userInput atIndex:indexPath.row];
        [tableView reloadData];
    }];

    [alert addAction:ok];
    [self presentViewController:alert animated:NO completion:nil];
    }

    NSLog(@"%@",self.alphabets);
}

使用上面的代码,我可以添加或插入带有用户输入的新行或单元格。

我使用UIAlertController来完成此任务。我在警报控制器中添加了一个UITextfield,现在可以从中获取输入。它又将它添加到数据源和重新加载的UITableview。

self.userInput是一个字符串,用于存储通过警报中的文本字段给出的用户输入。

如果有人认为此代码可以改进,请告诉我。我总是愿意提高自己。