为什么当我更改自定义单元格中的TextField时,另一个单元格中的另一个文本字段会发生更改

时间:2013-09-17 11:15:49

标签: ios objective-c uitableview custom-cell

我有一个带有自定义单元格的TableView,每个单元格都有一个文本字段,当我更改textField的值时,另一个单元格中的另一个文本字段会被更改。

例如:

我更改了单元格0中的值,单元格8也已更改

tableView cellForRowAtIndexPath方法

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

Disbursment_CustomCell *cell = (Disbursment_CustomCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) {

    cell = [[Disbursment_CustomCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] ;

}

 cell.disbursmentNumber_label.text = [[NSString alloc] initWithFormat:@"%d",[indexPath row]];
return cell;
}

CustomCell.m

@implementation Disbursment_CustomCell
@synthesize dateDisbursment_textField,pourcentage_Slider,pourcentage_textField;
-(IBAction) sliderChanged:(id) sender{
      self.pourcentage_textField.text=[NSString stringWithFormat:@"%li", lroundf(self.pourcentage_Slider.value)];
}
- (void)handlePickerChanged:(id)sender
{
   UIDatePicker *picker = (UIDatePicker *)sender;
NSDate *myDate = picker.date;
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"dd'/'MM'/'yyyy"];
NSString *prettyVersion = [dateFormat stringFromDate:myDate];
self.dateDisbursment_textField.text = prettyVersion;
}
- (IBAction)didBegin:(id)sender {

self.picker = [[UIDatePicker alloc] init];
self.picker.datePickerMode = UIDatePickerModeDate;
[self.picker addTarget:self action:@selector(handlePickerChanged:) forControlEvents:UIControlEventValueChanged];
dateDisbursment_textField.inputView = self.picker ;
}

@end

1 个答案:

答案 0 :(得分:0)

这个问题可能已经过时了,但对于像我这样有同样问题的人来说,这是我的解决方案:

我从上面的一条评论中得到了一个提示,说正在重复使用该单元格。情况就是这样。然后,可以将prepareForReuse方法作为UITableViewCell类的一部分找到。使用此方法(在调用super.prepareForReuse()之后),您可以插入一些行,将文本标签设置回默认值。任何被重用的单元格都会跳回到默认值。将此方法视为viewDidLoad类型的事物,但对于正在重复使用的单元格 - 当前不在屏幕上的单元格...

注意:我必须指出,一旦在表视图中向下滚动并备份,就会使用重用标识符重新创建这些单元格。因此,如果您对其中一个进行更改,然后向下滚动一点,然后再向上以使单元格再次显示在屏幕上,它将在prepareForReuse方法中执行什么...所以请尝试跟踪单元格标识或者其他东西(我使用了一个包含更改单元格的id的数组)。

就目前而言,这是我发现的最好的。如果我找到更好的东西,我会编辑我的答案。

prepareForReuse方法的代码:

override func prepareForReuse()
{
    super.prepareForReuse()
    if findInArray("\(stopName)\(routeNumber)\(lblTime.text)") == true
    {
        btnNotification.setTitle("☗", forState: UIControlState.Normal)
    }
    else
    {
        btnNotification.setTitle("☖", forState: UIControlState.Normal)
    }
}