当我在iOS

时间:2015-10-17 20:22:04

标签: ios objective-c uitableview

我有一个UITableView,允许用户动态地向表中添加行。 UITableView最初以0行开始。每行都是一个自定义的UITableViewCell,它包含两个独立的UITextField:一个保存文本,一个保存数字。 UITableView有一个显示4行的可见区域,然后在添加每个新行时滚动。每当用户添加一个新行时,我都会在NSMutableDictionary中的UITableView中添加先前添加的行中的值,其中键是name字段中的值,值来自number字段。

我成功地将行添加到UITableView,并成功将数据存储到我的NSMutableDictionary中。然而,我的问题是,在添加我的行之后,如果用户决定向上或向下滚动UITableView,突然之间,用户输入的表行中的数据完全关闭。

以下是我所谈论的屏幕截图:

它应该是什么样的:

enter image description here

滚动到顶部时的样子:

enter image description here

以下是我正在使用的相关代码:

- (IBAction)addChoice:(id)sender {

    if ([self.tableData count] > 0) {
        NSString *name = [[(MyCustomCell *)[self.choiceTable cellForRowAtIndexPath:[NSIndexPath indexPathForRow:[self.tableData count]-1 inSection:0]] nameField] text];
        NSString *number = [[(MyCustomCell *)[self.choiceTable cellForRowAtIndexPath:[NSIndexPath indexPathForRow:[self.tableData count]-1 inSection:0]] priceField] text];

        if (name && price) {

            [self.tableDictionary setObject:number forKey:name];

        }

    }

    NSString *theObjectToInsert = [NSString stringWithFormat:@"Row #: %lu", (unsigned long)[self.tableData count]];
    [self.tableData addObject:theObjectToInsert];
    NSIndexPath *newPath=[NSIndexPath indexPathForRow:self.tableData.count-1 inSection:0];
    [self.choiceTable insertRowsAtIndexPaths:@[newPath] withRowAnimation:UITableViewRowAnimationAutomatic];
    [self.choiceTable scrollToRowAtIndexPath:newPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];
    [[(MyCustomCell *)[self.choiceTable cellForRowAtIndexPath:[NSIndexPath indexPathForRow:[self.tableData count]-1 inSection:0]] nameField] becomeFirstResponder];

}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    MyCustomCell *cell = (MyCustomCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];

    if ([self.tableDictionary count] > 0) {

        NSArray *keys = [self.tableDictionary allKeys];

        if ([indexPath row] == 0) {
            cell.nameField.text = keys[indexPath.row];
            cell.numberField.text = self.tableDictionary[keys[indexPath.row]];

        } else if ([indexPath row] <= ([self.tableDictionary count]-1)) {

            cell.nameField.text = keys[indexPath.row-1];
            cell.numberField.text = self.tableDictionary[keys[indexPath.row-1]];

        }  else {//if the row was just added by the user, display a table with empty fields
            cell.nameField.text = @"";
            cell.numberField.text = @"";
        }

    }

    [cell.contentView setBackgroundColor:[UIColor colorWithRed:0.89 green:0.36 blue:0.01 alpha:1.0]];

    return cell;
}

任何人都可以看到我做错了什么吗?

1 个答案:

答案 0 :(得分:1)

NSDictionary值未订购。

您正在添加值并期望订购它们... 使用NSArray,或者为字典值指定键名,并通过键名而不是索引来获取

请看这里:Are keys and values in an NSDictionary ordered?