0

在此处输入图像描述我的要求是管理选择、全选和删除的表格视图行。删除行工作正常。但是当我选择行时,图像没有改变。请给我解决方案我在哪里犯了错误。我添加了我的代码

视图控制器.h

@interface ViewController : UIViewController<UITableViewDelegate>
{
    NSMutableArray *tableData;
    NSMutableSet *selectedRows;
    UIToolbar *actionToolbar;
    UIImageView *imgView;
    BOOL selected;
    UIBarButtonItem *actionButton,*selectAllButton,*deleteButton;
}
@property(nonatomic,retain)NSMutableSet *selectedRows;
@property(nonatomic,retain)IBOutlet UITableView *tableView;
- (BOOL)selected;
-(void)handleLongPress:(UILongPressGestureRecognizer *)gestureRecognizer;
- (NSIndexPath *)indexPathForCellController:(id)cellController;

视图控制器.m

#import "ViewController.h"
#import "MultiSelectTableViewCell.h"
@interface ViewController ()

@end
const NSInteger SELECTION_INDICATOR_TAG = 54321;
const NSInteger TEXT_LABEL_TAG = 54322;
@implementation ViewController
@synthesize tableView,selectedRows;


- (void)viewDidLoad
{
    [super viewDidLoad];
    tableData=[[NSMutableArray alloc]init];
    [tableData addObject:@"Row1"];
     [tableData addObject:@"Row2"];
     [tableData addObject:@"Row3"];
     [tableData addObject:@"Row4"];
     [tableData addObject:@"Row5"];
     [tableData addObject:@"Row6"];
     [tableData addObject:@"Row7"];
     [tableData addObject:@"Row8"];
     [tableData addObject:@"Row9"];
     [tableData addObject:@"Row10"];


    selectedRows=[[NSMutableSet alloc]init];
    actionToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 416, 320, 44)];
    actionButton =
    [[UIBarButtonItem alloc]
      initWithTitle:@"Submit"
      style:UIBarButtonItemStyleBordered
      target:self
      action:@selector(noAction:)];

    NSMutableArray *buttons = [[NSMutableArray alloc ]initWithCapacity:2];

    selectAllButton=[[UIBarButtonItem alloc]initWithTitle:@"Select All" style:UIBarButtonItemStyleBordered target:self action:@selector(selectAllrows:)];

    deleteButton=[[UIBarButtonItem alloc]initWithTitle:@"Delete" style:UIBarButtonItemStyleBordered target:self action:@selector(deleterows:)];

    [self.tableView setAllowsSelectionDuringEditing:YES];

    self.tableView.allowsMultipleSelection = YES;

    selected=NO;

    [buttons addObject:actionButton];
    [buttons addObject:selectAllButton];
    [buttons addObject:deleteButton];


    [actionToolbar setItems:buttons];

    [self.view addSubview:actionToolbar];

    UILongPressGestureRecognizer *lpgr = [[UILongPressGestureRecognizer alloc]
                                          initWithTarget:self action:@selector(handleLongPress:)];
    lpgr.minimumPressDuration = 2.0; //seconds
    lpgr.delegate = self;
    [self.tableView addGestureRecognizer:lpgr];
    // Do any additional setup after loading the view, typically from a nib.
}
-(void)handleLongPress:(UILongPressGestureRecognizer *)gestureRecognizer
{
    CGPoint p = [gestureRecognizer locationInView:self.tableView];

    NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:p];
    if (indexPath == nil)
        NSLog(@"long press on table view but not on a row");
    else
        NSLog(@"long press on table view at row %d", indexPath.row);}
- (void)noAction:(id)sender
{

}
- (void)deleterows:(id)sender
{
//    [self.tableView deleteRowsAtIndexPaths:arrayOfIndexPathsToDelete withRowAnimation:UITableViewRowAnimationTop];
    NSLog(@"select rows are::%@ %d",selectedRows,[selectedRows count]);

    NSArray *array=[selectedRows allObjects];
    NSLog(@"indexes are::%@",array);

    for (int i=0; i<[array count]; i++) {
        NSLog(@"------%@",[array objectAtIndex:i]);

        NSIndexPath *myIP = [NSIndexPath indexPathForRow:[[array objectAtIndex:i] intValue] inSection:0] ;
        [self tableView:self.tableView commitEditingStyle:UITableViewCellEditingStyleDelete forRowAtIndexPath:myIP];

    }


//    [self.tableView deleteRowsAtIndexPaths:array withRowAnimation:UITableViewRowAnimationTop];

}
- (void)tableView:(UITableView *)tableview commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    if(editingStyle == UITableViewCellEditingStyleDelete) {
        //Delete the object from the friends array and the table.
        [tableData removeObjectAtIndex:indexPath.row];
        NSLog(@"------%@",[indexPath description]);
        [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
    }
}
- (void)selectAllrows:(id)sender
{

}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}
-(void)viewDidAppear:(BOOL)animated

{
    [self.tableView setEditing:YES];
}
// Customize the number of rows in the table view.
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return [tableData count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellIdentifier = @"MultiSelectCellController";
    UITableViewCell *cell =
    [self.tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    UIImageView *indicator;
    UILabel *textLabel;
    if (!cell)
    {
        cell =
        [[MultiSelectTableViewCell alloc]
          initWithFrame:CGRectMake(0, 0, 320,self.tableView.rowHeight)
          reuseIdentifier:cellIdentifier];


        indicator = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"NotSelected.png"]];

        const NSInteger IMAGE_SIZE = 30;
        const NSInteger SIDE_PADDING = 5;

        indicator.tag = SELECTION_INDICATOR_TAG;
        indicator.frame =
        CGRectMake(-EDITING_HORIZONTAL_OFFSET + SIDE_PADDING, (0.5 *self.tableView.rowHeight) - (0.5 * IMAGE_SIZE), IMAGE_SIZE, IMAGE_SIZE);
        [cell.contentView addSubview:indicator];

        textLabel = [[UILabel alloc] initWithFrame:CGRectMake(SIDE_PADDING, 0, 320, self.tableView.rowHeight)];
        textLabel.tag = TEXT_LABEL_TAG;
        textLabel.textColor = [UIColor blackColor];
        textLabel.backgroundColor = [UIColor clearColor];
        textLabel.font = [UIFont boldSystemFontOfSize:[UIFont labelFontSize]];
        [cell.contentView addSubview:textLabel];

        cell.selectionStyle = UITableViewCellSelectionStyleNone;
        cell.backgroundView = [[UIView alloc] init];
    }
    else
    {
        indicator = (UIImageView *)[cell.contentView viewWithTag:SELECTION_INDICATOR_TAG];
        textLabel = (UILabel *)[cell.contentView viewWithTag:TEXT_LABEL_TAG];
    }

    textLabel.text = [tableData objectAtIndex:[indexPath row]];



    if (selected)
    {
        indicator.image = [UIImage imageNamed:@"IsSelected.png"];
        cell.backgroundView.backgroundColor = [UIColor colorWithRed:223.0/255.0 green:230.0/255.0 blue:250.0/255.0 alpha:1.0];
    }
    else
    {
        indicator.image = [UIImage imageNamed:@"NotSelected.png"];
        cell.backgroundView.backgroundColor = [UIColor whiteColor];
    }

    return cell;
}

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return 45;
}
- (BOOL)selected
{
    return selected;
}

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (self.tableView.isEditing)
    {
        //selected = !selected;

        selected=[self selected];

        NSNumber *rowNsNum = [NSNumber numberWithUnsignedInt:indexPath.row];
        if ( [self.selectedRows containsObject:rowNsNum] )
            [self.selectedRows removeObject:rowNsNum];
        else
        {
            [self.selectedRows addObject:rowNsNum];
            NSLog(@"index is:::%@",rowNsNum);
        }

        [self.tableView performSelector:@selector(reloadData) withObject:nil afterDelay:0.2];

        UITableViewCell *cell =[self.tableView cellForRowAtIndexPath:[self indexPathForCellController:[tableData objectAtIndex:[indexPath row]]]];
//    [tableView cellForRowAtIndexPath:
//     [(RootViewController *)tableView.delegate
//      indexPathForCellController:self]];

    UIImageView *indicator = (UIImageView *)[cell.contentView viewWithTag:SELECTION_INDICATOR_TAG];
    if (selected)
    {

        indicator.image = [UIImage imageNamed:@"IsSelected.png"];
        cell.backgroundView.backgroundColor = [UIColor colorWithRed:223.0/255.0 green:230.0/255.0 blue:250.0/255.0 alpha:1.0];
         selected = !selected;
    }
    else
    {
        indicator.image = [UIImage imageNamed:@"NotSelected.png"];
        cell.backgroundView.backgroundColor = [UIColor whiteColor];
    }
    }


//
//    cell.imageView.image = imgView.image;
}

- (NSIndexPath *)indexPathForCellController:(id)cellController
{


     NSLog(@"cell controller is;::%@",cellController);
    NSInteger sectionIndex;
//  NSInteger sectionCount = [tableData count];
    for (sectionIndex = 0; sectionIndex < 1; sectionIndex++)
    {
        NSArray *section = tableData;
        NSInteger rowIndex;
         NSLog(@"section count is:::%d",[section count]);
        NSInteger rowCount = [section count];
        for (rowIndex = 0; rowIndex < rowCount; rowIndex++)
        {
            NSArray *row = [section objectAtIndex:rowIndex];
            NSLog(@"row is:::%@",row);
            if ([row isEqual:cellController])
            {
                 selected=YES;
                 NSLog(@"row index is::%d",rowIndex);
                return [NSIndexPath indexPathForRow:rowIndex inSection:sectionIndex];
            }
        }
    }

    return nil;
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

MultiSelectTableViewCell.h

#import <UIKit/UIKit.h>

@interface MultiSelectTableViewCell : UITableViewCell
{

}

@end

extern const NSInteger EDITING_HORIZONTAL_OFFSET;

MultiSelectTableViewCell.m

#import "MultiSelectTableViewCell.h"

const NSInteger EDITING_HORIZONTAL_OFFSET = 30;

@implementation MultiSelectTableViewCell

//
// setEditing:animated:
//
// Refreshed the layout when editing is enabled/disabled.
//
- (void)setEditing:(BOOL)editing animated:(BOOL)animated
{
    [self setNeedsLayout];
}

//
// layoutSubviews
//
// When editing, displace everything rightwards to allow space for the
// selection indicator.
//
- (void)layoutSubviews
{
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationBeginsFromCurrentState:YES];

    [super layoutSubviews];

    if (((UITableView *)self.superview).isEditing)
    {
        CGRect contentFrame = self.contentView.frame;
        contentFrame.origin.x = 30;
        self.contentView.frame = contentFrame;
    }
    else
    {
        CGRect contentFrame = self.contentView.frame;
        contentFrame.origin.x = 30;
        self.contentView.frame = contentFrame;
    }

    [UIView commitAnimations];
}

@end
4

2 回答 2

0

你没有处理正确选择的标签 BOOL。在 didselect 委托方法中尝试这个..

     UIImageView *indicator = (UIImageView *)[cell.contentView viewWithTag:SELECTION_INDICATOR_TAG];
        if (selected)
        {

            indicator.image = [UIImage imageNamed:@"NotSelected.png"];
            cell.backgroundView.backgroundColor = [UIColor colorWithRed:223.0/255.0 green:230.0/255.0 blue:250.0/255.0 alpha:1.0];

        }
        else
        {
            indicator.image = [UIImage imageNamed:@"Selected.png"];
            cell.backgroundView.backgroundColor = [UIColor whiteColor];

        }
 selected = !selected;
        }
于 2013-02-26T12:20:40.527 回答
0

如果您想要与图像示例中显示的完全一样,我假设您想要在那里进行 V 检查。
单元格已经具有“选定”属性,您不必使用 BOOLEAN 处理它。您所要做的就是使用方法选择一行:

[tableView selectRowAtIndexPath:<#(NSIndexPath *)#> animated:<#(BOOL)#> scrollPosition:<#(UITableViewScrollPosition)#>]

[tableView deselectRowAtIndexPath:<#(NSIndexPath *)#> animated:<#(BOOL)#>]

然后在委托方法中更改图像

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = (UITableViewCell *)[tableView cellForRowAtIndexPath:indexPath];
    cell.imageView.image = [UIImage imageNamed:@"selected_cell_image"];
}

- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = (UITableViewCell *)[tableView cellForRowAtIndexPath:indexPath];
    cell.imageView.image = [UIImage imageNamed:@"deselected_cell_image"];
}
于 2013-02-26T12:41:33.487 回答