访问cellForRowAtIndexPath之外的自定义单元格属性

我想要一些像下面的图片。 用户可以点击+或 – button,增加或减less的计数显示在UILabel中,即下图中的1。
我知道如何实现自定义表格视图单元格。我知道如何实现select器。 但我需要设置的标签文本按照那个button只是问题。 我怎样才能更新button单击设置文本的自定义单元格的UILabel 从cellForRowAtIndexPath外添加减法function。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { //self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone; static NSString *simpleTableIdentifier = @"ProductListVIICell"; ProductListVIICell *cell = (ProductListVIICell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier]; if (cell == nil) { NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"ProductListVIICell" owner:self options:nil]; cell = [nib objectAtIndex:0]; } .................................... cell.btnMinus.tag = indexPath.row; cell.btnPlus.tag = indexPath.row; [cell.btnPlus addTarget:self action:@selector(addItem:) forControlEvents:UIControlEventTouchUpInside]; [cell.btnMinus addTarget:self action:@selector(deleteItem:) forControlEvents:UIControlEventTouchUpInside]; cell.lblCount.tag = [[NSString stringWithFormat:@"%d%d",addBtnClickCount,addBtnClickCount] integerValue]; return cell; } 

我需要在这里做事,但没有得到我想要的成就。 cell.lblTitle.text正常工作

  #pragma mark - UIButton selector -(void)addItem:(UIButton*)button { itemCount++; NSIndexPath *indexPath = [NSIndexPath indexPathForRow:button.tag inSection:1]; ProductListVIICell *cell = (ProductListVIICell *)[self.tableView cellForRowAtIndexPath:indexPath]; cell.lblCount.textColor = [UIColor redColor]; cell.lblTitle.text = [NSString stringWithFormat:@"%d",itemCount]; NSIndexPath* rowToReload = [NSIndexPath indexPathForRow:[button tag] inSection:0]; NSArray* rowsToReload = [NSArray arrayWithObjects:rowToReload, nil]; [self.tableView reloadRowsAtIndexPaths:rowsToReload withRowAnimation:UITableViewRowAnimationNone]; NSLog(@"%d",itemCount); [self.tableView reloadData]; } -(void)deleteItem:(UIButton*)button { itemCount--; NSIndexPath *indexPath = [NSIndexPath indexPathForRow:button.tag inSection:1]; ProductListVIICell *cell = (ProductListVIICell *)[self.tableView cellForRowAtIndexPath:indexPath]; cell.lblCount.textColor = [UIColor redColor]; cell.lblTitle.text = [NSString stringWithFormat:@"%d",itemCount]; NSIndexPath* rowToReload = [NSIndexPath indexPathForRow:[button tag] inSection:0]; NSArray* rowsToReload = [NSArray arrayWithObjects:rowToReload, nil]; [self.tableView reloadRowsAtIndexPaths:rowsToReload withRowAnimation:UITableViewRowAnimationNone]; NSLog(@"%d",itemCount); [self.tableView reloadData]; } 

在这里输入图像说明

这些链接也很有用

访问cellForRowAtIndexPath之外的单元格属性

http://code.tutsplus.com/tutorials/blocks-and-table-view-cells-on-ios–mobile-22982但它只是UITableViewCell不是自定义单元格

我能够使用以下解决我的问题

 @interface ProductListVC () { int count; bool addBtnClicked; bool minusBtnClicked; } @property (strong,nonatomic) NSMutableArray* quantityArray; //stores label @property (strong,nonatomic) NSMutableArray* quantityLabelArray; //stores label - (void)viewDidLoad { [super viewDidLoad]; _quantityLabelArray = [[NSMutableArray alloc] init]; _quantityArray = [[NSMutableArray alloc] init]; //determine num of row prevent index 2 beyond bounds for empty array error ie insert straight to let's say index 3 for (int i=0; i <=[_productArray count]; i++) { [_quantityArray addObject:@"0"]; } } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { ................ if (!_quantityArray || !_quantityArray.count){ cell.lblCount.text = [NSString stringWithFormat:@"%d", 0]; }else{ cell.lblCount.text = [_quantityArray objectAtIndex:indexPath.row]; } [_quantityLabelArray addObject:cell.lblCount]; if (addBtnClicked || minusBtnClicked) { //If add or minu button is reloading the cell cell.lblCount.text = [_quantityArray objectAtIndex:indexPath.row]; //NSLog(@"%@",cell.lblCount.text); [_quantityLabelArray replaceObjectAtIndex:indexPath.row withObject:cell.lblCount]; addBtnClicked = NO; minusBtnClicked = NO; } else { } cell.btnMinus.tag = indexPath.row; cell.btnPlus.tag = indexPath.row; cell.lblCount.tag = indexPath.row; [cell.btnPlus addTarget:self action:@selector(addItem:) forControlEvents:UIControlEventTouchUpInside]; [cell.btnMinus addTarget:self action:@selector(deleteItem:) forControlEvents:UIControlEventTouchUpInside]; cell.selectionStyle = UITableViewCellSelectionStyleNone; return cell; } #pragma mark - UIButton selector -(void)addItem:(UIButton*)button { NSLog(@"btn tag %ld",(long)[button tag]); NSLog(@"quantitylblarry %@",_quantityLabelArray); UILabel* lblShowCount = [_quantityLabelArray objectAtIndex:[button tag]]; if ([lblShowCount.text integerValue]< 10) { count = count+1; lblShowCount.text = [NSString stringWithFormat:@"%ld", [lblShowCount.text integerValue]+1]; } NSLog(@"quantity array count %lu",(unsigned long)_quantityArray.count); if (_quantityArray.count > [button tag] ) { [_quantityArray removeObjectAtIndex:[button tag]]; [_quantityArray insertObject:lblShowCount.text atIndex:[button tag]]; } else{ [_quantityArray insertObject:lblShowCount.text atIndex:[button tag]]; } addBtnClicked = YES; NSLog(@"quantity array %@",_quantityArray); NSIndexPath* rowToReload = [NSIndexPath indexPathForRow:[button tag] inSection:0]; NSArray* rowsToReload = [NSArray arrayWithObjects:rowToReload, nil]; [self.tableView reloadRowsAtIndexPaths:rowsToReload withRowAnimation:UITableViewRowAnimationNone]; } -(void)deleteItem:(UIButton*)button{ NSLog(@"%ld",(long)[button tag]); UILabel* lblShowCount = [_quantityLabelArray objectAtIndex:[button tag]]; if ([lblShowCount.text integerValue]>=1) { count = count-1; lblShowCount.text = [NSString stringWithFormat:@"%ld", [lblShowCount.text integerValue]-1]; } NSLog(@"%lu",(unsigned long)_quantityArray.count); if (_quantityArray.count > [button tag] ) { [_quantityArray removeObjectAtIndex:[button tag]]; [_quantityArray insertObject:lblShowCount.text atIndex:[button tag]]; } else{ [_quantityArray insertObject:lblShowCount.text atIndex:[button tag]]; } NSLog(@"%@",_quantityArray); minusBtnClicked =YES; NSLog(@"quantity array %@",_quantityArray); NSIndexPath* rowToReload = [NSIndexPath indexPathForRow:[button tag] inSection:0]; NSArray* rowsToReload = [NSArray arrayWithObjects:rowToReload, nil]; [self.tableView reloadRowsAtIndexPaths:rowsToReload withRowAnimation:UITableViewRowAnimationNone]; } 

最好使用自定义单元格。 检查这个教程或这个教程 ,那么你将需要添加委托到这个单元格,以便您可以与您同步数量ViewController

 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { CustomTableViewCell *cell = (CustomTableViewCell *)[tableView dequeueReusableCellWithIdentifier:@"CustomTableViewCell" forIndexPath:indexPath]; cell.delegate = self; cell.itemIndex = indexPath.row; .... return cell } 

UPDATE

如果你有一个自定义的单元格,你可以添加一个UILabelsockets并在+/-button的操作中修改它的文本,所有这些代码都将在CustomTableViewCell.m

 -(void)addItem:(UIButton*)button { self.itemQuantity++; [self updateQuantity]; } -(void)deleteItem:(UIButton*)button { self.itemQuantity--; [self updateQuantity]; } - (void)updateQuantity{ self.lblCount.text = [NSStirng stringWithFormat:@"%d", self.itemQuantity]; [self.delegate updateItemAtIndex:self.itemIndex withQuantity:self.itemQuantity]; } 

更新:完整的解决scheme

1.型号

 @interface Item : NSObject @property (nonatomic, strong) NSString *title; @property (nonatomic) NSInteger quantity; @end @implementation Item @end 

2.自定义单元格

 @interface CustomItemTableViewCell : UITableViewCell @property (nonatomic, weak) IBOutlet UILabel *lblTitle; @property (nonatomic, weak) IBOutlet UILabel *lblCount; @property (nonatomic, assign) Item *item; @end @implementation CustomItemTableViewCell - (void)updateCellWithItem:(Item *)item { self.item = item; [self updateCellView]; } - (void)updateCellView { self.lblTitle.text = self.item.title; self.lblTitle.text = [NSString stringWithFormat:@"%ld", self.item.quantity]; } - (IBAction)addItem:(UIButton*)button { self.item.quantity++; [self updateCellView]; } - (IBAction)deleteItem:(UIButton*)button { self.item.quantity--; [self updateCellView]; } @end 

3. TableViewController

 @interface ItemsTableViewController : UITableViewController @property (nonatomic, strong) NSArray *items; @end @implementation ItemsTableViewController #pragma mark - Table view data source - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 1; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return self.items.count; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { CustomItemTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CustomItemCell" forIndexPath:indexPath]; [cell updateCellWithItem:self.items[indexPath.row]]; return cell; } 

要更改单元格标签文本,您需要在这些select器中提取单元格对象,只需使用sender参数就可以完成这个操作。 有关添加function,请参阅下面的代码。

 -(void)addItem:(UIButton*) button { NSLog(@"UIButton%ld",(long)button.tag); addBtnClickCount++; //Increase the count by 1 MyCustomCell *cell = button.superview.superview; //Now change the label text for cell cell.lblCount.text = [NSString stringWithFormat:@"%d",addBtnClickCount]; } 

您可以使用相同的方式来减去function。

在自定义tableview单元格中使用更陡峭的控制。

这是我的screen.i使用步进控制和标签。

customcell.h类

 @property (weak, nonatomic) IBOutlet UIStepper *stepper; @property (weak, nonatomic) IBOutlet UILabel *lbl_value; 

**** **** customcell.m

 - (IBAction)stepper:(UIStepper *)sender { NSUInteger value = sender.value; lbl_value.text = [NSString stringWithFormat:@"%03d",value]; self.txt1.text= [NSString stringWithFormat:@"%03d",value]; }