在tableview单元格中显示图像

时间:2017-05-13 06:19:26

标签: ios objective-c uitableview uibutton

我必须在图表单元格中显示图像,然后点击图像上的前进按钮,但滚动后的桌面图像正在改变... 我已经为单元格中的每个按钮指定了标记值,并将所有单元格引用存储在数组中,并且单击了向前按钮我正在识别数组中的引用并更改该特定引用的图像。

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

  //  static NSString *cellidentifier = @"cell";
   cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
    if (cell == nil) {
        cell = [[LotsandLandTableCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
    }
   // cell.smallimage.image=[UIImage imageNamed:[_smallimagesarr objectAtIndex:indexPath.row]];
    //if ( [str_scroll isEqualToString: @"scrolling"]) {

  //  }else{
    cell.bigimage.image=[UIImage imageNamed:[_bigimagesarr objectAtIndex:indexPath.row]];
    //}

     cell.forwardbutton.tag =indexPath.row;
    NSLog(@" %p",cell);
    [cell.forwardbutton addTarget:self action:@selector(buttonInfo:) forControlEvents:UIControlEventTouchUpInside];
 CellModel *cellmodel=[[CellModel alloc]init];
    cellmodel.tagValue=cell.forwardbutton.tag;
    cellmodel.cellobj=cell;
    [arrofcells addObject:cellmodel];
    NSLog(@"%p",cell);
    return cell;

}


-(void)buttonInfo:(UIButton *)sender{
    UIButton *btn = (UIButton *)sender;
    NSInteger tag = btn.tag;

   CellModel *cmodel=[[CellModel alloc]init];

    cmodel=[arrofcells objectAtIndex:tag];
    democell=(LotsandLandTableCell *)cmodel.cellobj;


   previoustag=cmodel.tagValue;
 if(cmodel.tagValue==previoustag)
   {

       if(j<_bigimagesarr1.count){
       democell.bigimage.image=[UIImage imageNamed:[_bigimagesarr1 objectAtIndex:j]];
      NSLog(@"j value is  is  %d",j);
           j++;

      }else{
          j=0;
         [democell.forwardbutton setEnabled:NO];

       }

  }
}

cellModel包含单元格引用和属性标记

@interface CellModel : NSObject
@property (nonatomic, assign) NSInteger tagValue;
@property(nonatomic,strong) id cellobj;
@end

3 个答案:

答案 0 :(得分:2)

您当前的代码没有使用适当的关注点分隔;您的表视图控制器不关心当前在单元格中显示哪个图像,因此尝试处理表视图控制器中的按钮点击是不必要的复杂。

您尚未显示所有源代码,因此我所拥有的内容可能与您的代码100%不符 - 我正在做出有根据的猜测。此外,您似乎有两个不同的图像阵列,我认为这只是您的测试方法。实际上,每个单元格应该有一个单独的图像数组,每个数组都包含在其他数据结构中,其中一个数组是您的tableview的数据源。

<强> LotsandLandTableCell.h

- (void)setImages:(NSArray *)images;

<强> LotsandLandTableCell.m

 @property (weak, nonatomic) NSArray *bigImages;
 @property NSInteger imageIndex;

-(void) prepareForReuse {
    self.bigImages = nil;
    self.bigimage.image = nil;
    self.imageIndex = 0;
}

-(void) setImages:(NSArray *)images {
    if (images != null) {
        self.bigImages = images;
        self.imageIndex = 0;
        [self updateBigImage];
    }
}

@IBAction forwardTapped:(UIButton *)sender {
    if (self.images.count == 0) {
        return;
    }
    self.imageIndex = (self.imageIndex + 1) % self.images.count;
    [self updateBigImage];
}

@IBAction backwardTapped:(UIButton *)sender {
   if (self.images.count == 0) {
       return;
   }
   self.imageIndex -= 1;
   if (self.imageIndex < 0) {
       self.imageIndex = self.bigImages.count;
   }
   [self updateBigImage];
}

- (void) updateBigImage {
    self.bigimage.image = [UIImage imageNamed:self.images[self.imageIndex]];
}

查看控制器

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    LotsandLandTableCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
    if (cell == nil) {
        cell = [[LotsandLandTableCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
    }

     NSArray *yourImagesArray = yourDataArray[indexPath.row].bigImages; // Change this

     [cell setImages:yourImageArray];

     return cell;
}

答案 1 :(得分:0)

在LotsandLandTableCell类中添加它

cts:query

滚动tableView时图像正在改变,因为它可能会使用前一个图像,因此当tableView重用其单元格时,最好清除以前的单元格数据。

答案 2 :(得分:0)

显示行和图像的方式存在问题。

您需要按照以下步骤获得最佳效果:

  1. 创建项目用于在行中填充数据的模型(在您的情况下,CellModel也可以工作) 以下可能是模型的属性:
    • 的ItemID
    • 价格
    • 描述
    • 区域
    • imageNames(Array)等
  2. imageNames数组将包含您在向前单击特定行时要显示的所有图像名称。

    将此项对象分配给LotsandLandTableCell类,并在单元格本身中处理前进按钮回调,在向前单击时从imagenNames数组中选择另一个名称并将其设置为imageView。

    因此,通过使用上述方法,您可以实现此whiteout任何问题。

    您可以创建所有属性的数组(一个项目模型将代表一个属性)。

    以下样本可以作为参考:

    - (NSInteger)numberOfRowsInSection:(NSInteger)section
    {
      return items.count;
    }
    
    -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    
      //  static NSString *cellidentifier = @"cell";
       cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
        if (cell == nil) {
            cell = [[LotsandLandTableCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
        }
    
    cell.item = [items objectAtIndex:indexpath.row];
        return cell;
    
    }
    

    现在,在自定义单元类中,您可以实现其余逻辑来填充所有单元格数据: