自定义TableView-Cell(来自服务器的数据)通过附件更改选择多个值

时间:2013-08-14 09:15:20

标签: objective-c uitableview customization

我正在使用TableView,并希望自定义TableViewCell具有小图像,名称和一个自定义图像(使用Tickmark和不带勾号)可以在附件上显示是否选择了单元格,如果未选中它将显示没有勾选未选择的单元格上的图像。 如果我想选择多个单元格,那么它应该在选定的单元格上显示Tick图像,在未选择的单元格上显示Untick图像,然后当我点击一个按钮时,我应该能够获得所选的单元格ID。

在tableView上我从服务器获取所有值,图像也来自URL,但Tickmark和Unselected Tick标记图像将用于项目本身。

到目前为止,我创建了: UITableViewCell类型的“ResultTableCell”的类.h,.m,.xib和我的主视图“结果”,其中TableView和按钮位于顶部(点击按钮我将获得所选单元格的值)

ResultTableCell.h

#import <UIKit/UIKit.h>

@interface ResultTableCell : UITableViewCell

@property (nonatomic, retain) IBOutlet UILabel *nameLabel;
@property (nonatomic, retain) IBOutlet UIImageView *thumbImageView;

ResultTableCell.m

#import "ResultTableCell.h"

@implementation ResultTableCell
@synthesize nameLabel,thumbImageView;

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        // Initialization code
    }
    return self;
}

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    [super setSelected:selected animated:animated];

    // Configure the view for the selected state
}

ResultTableCell.xib xib上的右侧图像是存取图像的位置。 ResultTableCell.xib

主要的xib 的 Result.h

#import <UIKit/UIKit.h>

#import "ASIFormDataRequest.h"

@interface Results : UIViewController <UITableViewDelegate,UITableViewDataSource>
{
    NSMutableArray *nameData;

}
@property (nonatomic, retain)NSMutableArray *nameData;
@property (nonatomic, retain)NSMutableArray *ImageData;
@property (nonatomic, retain)NSMutableArray *idData;
@property (nonatomic, retain)UITableView *table;


@property (nonatomic, retain) IBOutlet UIButton *done;

@property (nonatomic, retain) NSMutableArray *arFors;

-(IBAction)save_done:(id)sender;

Result.m

#import "Results.h"

#import "ResultTableCell.h"

@interface Results ()

@end

@implementation Results
@synthesize arFors;
@synthesize done,nameData,table,addressData,ImageData,idData;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}


- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.



    self.arFors=[NSMutableArray array];

   // I am Getting Name,id and image url data from my HomeViewController


    NSLog(@"Name Data from home view is %@",nameData); // 10 Names get's printed in log
    NSLog(@"id Data is %@",idData);
    NSLog(@"URL image data is %@",ImageData);

    table = [[UITableView alloc]initWithFrame:CGRectMake(0, 221, 320, 327) style:UITableViewStylePlain];
    table.delegate = self;
    table.dataSource = self;
    [self.view addSubview:table];

    -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    NSLog(@"Name data count is %d",nameData.count);
    return nameData.count;
    //return 10;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return 70;
}

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

    static NSString *simpleTableIdentifier = @"ResultTableCell";

    ResultTableCell *cell = (ResultTableCell *)[table dequeueReusableCellWithIdentifier:simpleTableIdentifier];

     if (cell == nil)
    {
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"ResultTableCell" owner:self options:nil];
        cell = [nib objectAtIndex:0];
    }


    if ([self.arFors containsObject:[NSNumber numberWithInt:indexPath.row]]) {

        cell.accessoryView = [[ UIImageView alloc ]
                                initWithImage:[UIImage imageNamed:@"table_tick" ]];
    }
    else {

        cell.accessoryView = [[ UIImageView alloc ]
                              initWithImage:[UIImage imageNamed:@"table_add" ]];
    }
    NSLog(@"data is ************* %@",nameData);

      cell.nameLabel.text = [nameData objectAtIndex:indexPath.row];

    NSURL * imageURL = [NSURL URLWithString:[ImageData objectAtIndex:indexPath.row]];
    NSData * imageData = [NSData dataWithContentsOfURL:imageURL];
    UIImage * image2 = [UIImage imageWithData:imageData];

      cell.ImageView.image = image2;

    cell.ImageView.contentMode  = UIViewContentModeScaleAspectFit;


    return cell;


}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"didSelectRowAtIndexPath %d",indexPath.row);


    if ([self.arFors containsObject:[NSNumber numberWithInt:indexPath.row]]) {
        [self.arFors removeObject:[NSNumber numberWithInt:indexPath.row]];

    }
    else{
        [self.arFors addObject:[NSNumber numberWithInt:indexPath.row]];
       // [self.table cellForRowAtIndexPath:indexPath];

    }
   [tableView deselectRowAtIndexPath:indexPath animated:YES];

    [tableView reloadData];
}

-(IBAction)save_done:(id)sender
{

     NSLog(@"selected cell values are %@",self.arFors);


}

现在使用此代码一切正常(选定单元格上显示勾选图像,未选中单元格上的取消勾选图像,单击完成按钮后,我将获得所选单元格值),

但问题出现的时候,当我点击一个单元格然后它就像挂起并需要5-6秒的时间来更改存取器图像,因为它在didselectrowatindexpath方法中触发 [tableView reloadData] 所以所有数据重新加载再次在tableview中,然后访问者图像更改,请任何人可以更正我的代码或增强它,以便它快速工作。 我已经尝试了很多方法但是如果没有重新加载表我就无法做到这一点,如果我重新加载表需要很长时间。 编码帮助将非常多。

1 个答案:

答案 0 :(得分:3)

你的问题是:

NSData * imageData = [NSData dataWithContentsOfURL:imageURL];

因为每次重新加载表格视图时都会从网络下载所有图像数据。您应该异步执行此操作并缓存返回的图像,这样您就不需要重复下载它。看一下像SDWebImage这样的图书馆来帮助你解决这个问题。