tableview单元格中的文本字段更改文本值

时间:2015-08-25 18:42:42

标签: ios objective-c uitableview

我遇到的问题是,当我滚动我的tableview时,如果Textfields为空(并且显示占位符值),则行显示相应的占位符值就好了。但是,如果我开始浏览表格视图并在文本字段中输入文本,一旦我向下滚动,之前的文本字段值将开始显示在tableview中较低的其他文本字段中。我假设它与单元格标识符有关,但它似乎与我的标签和uitextfield占位符一起使用,而不是文本字段用户文本输入。有什么想法吗?这是代码......

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    static NSString *CellIdentifier = @"Cell";

    CustomCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[CustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }
    cell.headerLabel.text = @"some string";
    cell.textField.placeholder = @"some other string placeholder,";
    cell.textField.delegate = self;

    return cell;
}

这是CustomCell

-(id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier{
    if(self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]){
        headerLabel =[[UILabel alloc] initWithFrame:CGRectZero];
        headerLabel.translatesAutoresizingMaskIntoConstraints = NO;
        headerLabel.textColor = [UIColor colorWithRed:155.0/255.0 green:155.0/255.0 blue:155.0/255.0 alpha:1.0];
        headerLabel.font = [UIFont fontWithName:@"Helvetica Neue Reg" size:15];

        textField = [[UITextField alloc] initWithFrame:CGRectZero];
        textField.textColor = [UIColor colorWithRed:13.0/255.0 green:122/255.0 blue:255.0/255.0 alpha:1.0];
        textField.translatesAutoresizingMaskIntoConstraints = NO;
        textField.font = [UIFont fontWithName:@"Helvetica Neue" size:15];

        [self.contentView addSubview:headerLabel];
        [self.contentView addSubview:textField];

        [self.contentView addConstraint: [NSLayoutConstraint constraintWithItem:headerLabel
                                              attribute:NSLayoutAttributeLeading
                                              relatedBy:NSLayoutRelationEqual
                                                 toItem:self.contentView
                                              attribute:NSLayoutAttributeLeading
                                             multiplier:1
                                               constant:27 ] ] ;

        [self.contentView addConstraint: [NSLayoutConstraint constraintWithItem:headerLabel
                                              attribute:NSLayoutAttributeTop
                                              relatedBy:NSLayoutRelationEqual
                                                 toItem:self.contentView
                                              attribute:NSLayoutAttributeTop
                                             multiplier:1
                                               constant:10 ] ] ;

        [self.contentView addConstraint: [NSLayoutConstraint constraintWithItem:textField
                                              attribute:NSLayoutAttributeLeading
                                              relatedBy:NSLayoutRelationEqual
                                                 toItem:self.contentView
                                              attribute:NSLayoutAttributeLeading
                                             multiplier:1
                                               constant:27 ] ] ;

        [self.contentView addConstraint: [NSLayoutConstraint constraintWithItem:textField
                                              attribute:NSLayoutAttributeTop
                                              relatedBy:NSLayoutRelationEqual
                                                 toItem:headerLabel
                                              attribute:NSLayoutAttributeBottom
                                             multiplier:1
                                               constant:5 ] ] ;

        [self.contentView addConstraint: [NSLayoutConstraint constraintWithItem:textField
                                              attribute:NSLayoutAttributeTrailing
                                              relatedBy:NSLayoutRelationEqual
                                                 toItem:self.contentView
                                              attribute:NSLayoutAttributeTrailing
                                             multiplier:1
                                               constant:-27 ] ] ;

    }

    return self;
}

2 个答案:

答案 0 :(得分:0)

您是否为表格视图提供了支持数据源?您遇到此问题的原因是

  

[self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];

此方法重用您的单元格,因为您没有将文本与索引路径相关联,所以单元格会被重复使用,但会保留您在其标签中添加到其中的文本。

所以这是你如何解决它。假设您在文本字段中输入了一些文本。您需要存储此数据(我通常使用数组)并使其对应于修改文本字段的单元格的单元格indexPath.row属性。然后tableview使用此数据源填充单元格中的标签。 / p>

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";

    CustomCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    cell.headerLabel.text = @"some string";

    //Using your data source array to get your data for each cell
    cell.textField.text = self.myDataSourceTextArray[indexPath.row];
    cell.textField.delegate = self;

    return cell;
}

较难的部分是将文本字段与特定索引路径相关联。我会将单个单元格作为文本字段的委托,然后让单元格自己在更新文本字段时更新数据源并传递其各自的索引路径,以便保留正确单元格的文本。

答案 1 :(得分:0)

  

在我的情况下,我想使用存在于同一单元格上的按钮操作来减少tableview中的文本字段值

-(void)decreaseCount:(id)sender
{
    UIButton *btn = (UIButton *)sender;

    UITableViewCell *cell = (UITableViewCell *) [[btn superview]superview];

    NSIndexPath *path = [tableView indexPathForCell:cell];

    UITextField *tempText = (UITextField *)[cell viewWithTag:10];

    if ([tempText.text integerValue] >0) {
        tempText.text = [NSString stringWithFormat:@"%ld",[tempText.text integerValue]-1];

    }

    // in my case I want to update Array
    [self updateArray: btn.tag :tempText.text];

}

// here i have replace the array object as per my need
-(void)updateArray:(int) index :(NSString *)str
{
    NSMutableArray * arrayCount = [[NSMutableArray alloc]init];
    NSMutableDictionary *dict = [[NSMutableDictionary alloc]init];
    [dict setValue:str forKey:@"count"];
    [arrayCount replaceObjectAtIndex:index withObject:dict];

}