iosuitablevieweditmode

Hiding checkmarks in UITableView multiple selection during Edit Mode


I've got a UITableView which is automatically set up for multiple selection in Edit Mode using the following lines in viewDidLoad:

self.tableView.allowsMultipleSelectionDuringEditing = YES;
[self setEditing:YES animated:YES];

However, I'd like to indicate that a row was selected by changing its background color, rather than by the checkmarks which automatically appear along the left of each row. (For example, the ones that appear when editing the email list in the Mail app, or being discussed in this SO question.) I've got it working for the most part, except that I can't get those checkboxes, which are automatically created as part of putting the UITableView into Edit Mode, to go away.

Below is the code I'm working with:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return _Hierachy.cellCount;
}

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

    return testCell;
}

Those are the only UITableView methods I've got so far, so everything else should be default behavior.

Does anyone know how to hide those checkmarks along the left, in Edit Mode? I've seen many questions about checkmarks in the accessory portion of the cell, but as I understand it, this is a different thing. I've also seen people talk about the tableView:didSelectRowAtIndexPath: method, but these checkmarks are created when the table enters Edit mode and dismissed when the user taps "Done," so that method doesn't seem related.

The closest I've come is finding this method:

- (BOOL)tableView:(UITableView *)tableView shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath{
    return NO;
}

But that just prevents the cell's content from indenting to make room for the checkmarks. The checkmarks still appear.

Surely there's a way to hide those checkmarks, and still allow multiple selection in Edit Mode? Or are those checkmarks seriously mandatory behavior for a UITableView in Edit Mode with Multiple Selection enabled?

EDIT: I am (reluctantly) open to answers that are somewhat hack-y, like moving the frame of the checkmarks until it's off the screen. This app is for internal use, and won't need to be approved for the App Store. But given that the checkmarks are created automatically when the UITableView moves into Edit Mode, I don't even know how to get them as objects to alter. Any help would be appreciated!


Solution

  • You'll have to subclass your UITableViewCell and override the (void)setEditing:animated: method like this:

    #import "MyCustomCell.h"
    
    @implementation MyCustomCell
    
    - (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
    }
    
    - (void)setSelectedBackgroundView:(UIView *)selectedBackgroundView
    {
        //Cell Selected Color: CLEAR
        [super setSelectedBackgroundView:selectedBackgroundView];
    }
    
    - (void)setEditing:(BOOL)editing animated:(BOOL)animated
    {
        //Cell Edit Mode NO Indent & Selected Color: CLEAR
        [super setEditing:NO animated:animated];
        [self setNeedsLayout];
    }
    
    @end
    

    After you do that, go to Inteface Builder and make your cell part of the class MyCustomCell.

    After you make your cell part of MyCustomCell class in IB, import MyCustomCell.h in your UITableViewController and modify the following in your code:

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        MyCustomCell *testCell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
        if(testCell == nil) {
            testCell = [[MyCustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
        }
        [[testCell textLabel] setText:@"Test Cell"];
    
        return testCell;
    }
    

    UPDATE: You could also do the following in your TableView's tableView:editingStyleForRowAtIndexPath:

    - (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
    
    {
                return UITableViewCellEditingStyleNone;
    }
    

    But you will get your cell indented. To remove that indent you'll have to subclass the Cell.

    You should be good to go after doing this! I've just tested it and it works the way you want it!