自定义UITableViewCell重用与childviewcontroller问题

时间:2015-11-26 06:36:16

标签: ios objective-c uitableview

我创建了一个带有自定义TableViewCell的UITableView,

#import <UIKit/UIKit.h>
#import "Equipment.h"
#import "MCStepperViewController.h"

@class EquipmentCell;

@protocol EquipmentCellDelegate <NSObject>

- (void)EquipmentCell:(EquipmentCell *)cell didChangeStepperValue:(int)stepperValue indexPath:(NSIndexPath*)indexPath;

@end

@interface EquipmentCell : UITableViewCell <MCStepperDelegate>

@property (nonatomic, strong) UIImageView* eqiupmentImage;
@property (nonatomic, strong) UILabel* Title;
@property (nonatomic, strong) UILabel* details;
@property (nonatomic, strong) UILabel* prices;
@property (nonatomic, strong) MCStepperViewController* stepper;
@property (nonatomic, weak) id <EquipmentCellDelegate> delegate;
@property (nonatomic, assign) NSIndexPath* indexPath;

-(void)setContent:(Equipment*)equip;
-(void)setAmount:(int)eq_amount;
@end

自定义单元格拥有一个stepperview控制器,我将stepperViewController.view添加到单元格的内容视图中。

stepperViewController有一个textField和两个按钮作为强属性。

令人困惑的是,当我滚动表格视图时,表格单元格已准备好进行重用过程。

单元格的属性视图效果很好,但是stepViewViewController(它是contentView的子视图)的视图正在变得重复。

虽然我已将cell.stepper.view.textField设置为正确的值,但它仍然不起作用。

有什么好的解决方案吗?我不认为禁用可重用性是一个很好的尝试。

非常感谢!

编辑:

cellForRowAtIndexPath方法:

else if (tableView == _subTable)
{
    EquipmentCell *cell = [tableView dequeueReusableCellWithIdentifier:@"detailTable" forIndexPath:indexPath ];
    if(!cell)
    {
        cell = [[EquipmentCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"detailTable"];
    }
    cell.indexPath = indexPath;
    Equipment* item = [[[_goodsList objectAtIndex:indexPath.section] objectForKey:@"data"] objectAtIndex:indexPath.row];
    cell.delegate = self;
    [cell setContent:item];
    if (countDic) {
        if ([countDic objectForKey:[NSString stringWithFormat:@"%lu", (indexPath.section*100)+(indexPath.row)]]) {
            [cell setAmount:(int)[[countDic objectForKey:[NSString stringWithFormat:@"%lu", (indexPath.section*100)+(indexPath.row)]] integerValue]];
        }
        else
        {
            [cell setAmount:0];
        }
    }

    return cell;
}

我尝试在单元类中分配textfield.text,但是不起作用。

- (void)setAmount:(int)eq_amount
{
    _stepper.amount = eq_amount;
    _stepper.amountText.text = [NSString stringWithFormat:@"%d", eq_amount];
    if (eq_amount == self.stepper.min) {
        _stepper.minusButton.hidden = YES;
        _stepper.amountText.hidden = YES;
     }
}

1 个答案:

答案 0 :(得分:0)

检查将stepperViewController.view添加到单元格的内容视图的位置。

您希望支持tableview单元格的视图回收。因此,只要您的cell1不再可见并且数据2需要一个单元格(调用cellForRowAtIndexPath),此重用的单元格将是单元格1.而不是data1 cell1现在显示data2。如果在cellForRowAtIndexPath函数中添加stepperViewController.view,则会为data1添加视图。现在如果cell1不再可见并且应该用于data2,你应该检查你是否再次添加stepperViewController.view。

您可以检查单元格子视图中是否已存在stepperViewController.view,并删除或重复使用该视图,而不是简单地添加视图。