¿Cómo hago para que una UITableViewCell parezca deshabilitada?

Respuestas:

164

Puede simplemente deshabilitar los campos de texto de la celda para atenuarlos:

Swift 4.x

cell!.isUserInteractionEnabled = false
cell!.textLabel!.isEnabled = false
cell!.detailTextLabel!.isEnabled = false
Simétrico
fuente
17
O un poco más corto:cell.userInteractionEnabled = cell.textLabel.enabled = cell.detailTextLabel.enabled = NO;
Thomas Kekeisen
51
Sin embargo, más corto pero más feo
deportes
25

Una extensión Swift que funciona bien en el contexto en el que la estoy usando; Su experiencia puede ser diferente.

Rápido 2.x

extension UITableViewCell {
    func enable(on: Bool) {
        for view in contentView.subviews as! [UIView] {
            view.userInteractionEnabled = on
            view.alpha = on ? 1 : 0.5
        }
    }
}

Swift 3:

extension UITableViewCell {
    func enable(on: Bool) {
        for view in contentView.subviews {
            view.isUserInteractionEnabled = on
            view.alpha = on ? 1 : 0.5
        }
    }
}

Ahora es solo cuestión de llamar myCell.enable(truthValue).

Kevin Owens
fuente
22

Gracias a @Ajay Sharma, descubrí cómo hacer que una UITableViewCell parezca deshabilitada:

// Mac's native DigitalColor Meter reads exactly {R:143, G:143, B:143}.
cell.textLabel.alpha = 0.439216f; // (1 - alpha) * 255 = 143
aSwitch.enabled = NO; // or [(UISwitch *)cell.accessoryView setEnabled:NO];

Y luego, para deshabilitar realmente la celda:

cell.userInteractionEnabled = NO;
ma11hew28
fuente
Sí, por supuesto, también podría hacer lo mismo de esta manera, configurando el alfa :)
Ajay Sharma
18

Intente usar un pequeño truco:

Simplemente configure el alfa de la celda. Pon alguna condición como tus propios requisitos y establece el alfa.

cell.alpha=0.2;

Si no funciona, como te gustaría, usa el segundo truco,

Simplemente tome una imagen del tamaño de la celda con un fondo gris con fondo transparente, solo agregue esa imagen en la imagen sobre el contenido de la celda. Me gusta esto:

// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

    // Configure the cell...


    if(indexPath.row==0)
    {
        cell.userInteractionEnabled=FALSE;

        UIImageView *img=[[UIImageView alloc]init];
        img.frame=CGRectMake(0, 0, 320, 70);
        img.image=[UIImage imageNamed:@"DisableImage.png"];
        img.backgroundColor=[UIColor clearColor];
        [cell.contentView addSubview:img];
        [img release];

    }
    else {
        //Your usual code for cell interaction.

    }
    return cell;
}

Aunque no estoy seguro de la forma, esto seguramente cumplirá con su requisito. Esto dará una especie de ilusión en la mente del usuario de que la celda está Desactivada. Intente usar esta solución. Espero que eso resuelva su problema.

Ajay Sharma
fuente
5
cell.alpha = 0.2 - no funciona para mí. cell.ContentView.Alpha = 0.2 funcionó para mí
Michal Dobrodenka
Lo mismo aquí que configurar cell.alpha - no funciona, configurar cell.ContentView.alpha hace el trabajo
infinity_coding7
4

Gran extensión de Kevin Owens, esta es mi corrección para trabajar con Swift 2.x :

extension UITableViewCell {
    func enable(on: Bool) {
        self.userInteractionEnabled = on
        for view in contentView.subviews {
            view.userInteractionEnabled = on
            view.alpha = on ? 1 : 0.5
        }
    }
}

Swift 3:

extension UITableViewCell {
    func enable(on: Bool) {
        self.isUserInteractionEnabled = on
        for view in contentView.subviews {
            view.isUserInteractionEnabled = on
            view.alpha = on ? 1 : 0.5
        }
    }
}
Alessandro Ornano
fuente
Use .isUserInteractionEnabled en Swift 3.0
Matias Masso
4

Swift 4.X

Agradable extensión de Kevin Owens, estoy corrigiendo el comportamiento del celular.

extension UITableViewCell {
    func enable(on: Bool) {
        self.isUserInteractionEnabled = on
        for view in contentView.subviews {
            self.isUserInteractionEnabled = on
            view.alpha = on ? 1 : 0.5
        }
    }
}

Cómo llamar a esto: -

cell.enable(on: switch.isOn)

Ashu
fuente
2

He creado la siguiente extensión para habilitar / deshabilitar UITableViewCell, es muy conveniente usarla. Cree la extensión UITableViewCell con "UITableViewCell + Ext.h" que contenga lo siguiente.

@interface UITableViewCell (Ext)

- (void)enableCell:(BOOL)enabled withText:(BOOL)text;
- (void)enableCell:(BOOL)enabled withText:(BOOL)text withDisclosureIndicator:(BOOL)disclosureIndicator;
- (void)disclosureIndicator:(BOOL)disclosureIndicator;

@end

"UITableViewCell + Ext.m" contiene lo siguiente.

@implementation UITableViewCell (Ext)

- (UITableView *)uiTableView {
    if ([[UIDevice currentDevice] systemVersionIsGreaterThanOrEqualTo:@"7.0"]) {
        return (UITableView *)self.superview.superview;
    }
    else {
        return (UITableView *)self.superview;
    }
}

- (void)enableCell:(BOOL)enabled withText:(BOOL)text {
    if (enabled) {
        self.userInteractionEnabled = YES;

        if (text) {
            self.textLabel.alpha = 1.0f;
            self.alpha = 1.0f;
            self.detailTextLabel.hidden = NO;
        }
    }
    else {
        self.userInteractionEnabled = NO;

        if (text) {
            self.textLabel.alpha = 0.5f;
            self.alpha = 0.5f;
            self.detailTextLabel.hidden = YES;
        }
    }
}

- (void)enableCell:(BOOL)enabled withText:(BOOL)text withDisclosureIndicator:(BOOL)disclosureIndicator {
    if (enabled) {
        self.userInteractionEnabled = YES;

        if (text) {
            self.textLabel.alpha = 1.0f;
            self.alpha = 1.0f;
            self.detailTextLabel.hidden = NO;
        }

        self.accessoryType = disclosureIndicator ? UITableViewCellAccessoryDisclosureIndicator : UITableViewCellAccessoryNone;
    }
    else {
        self.userInteractionEnabled = NO;

        if (text) {
            self.textLabel.alpha = 0.5f;
            self.alpha = 0.5f;
            self.detailTextLabel.hidden = YES;
        }

        self.accessoryType = UITableViewCellAccessoryNone;
    }
}

- (void)disclosureIndicator:(BOOL)disclosureIndicator {
    if (disclosureIndicator) {
        self.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    }
    else {
        self.accessoryType = UITableViewCellAccessoryNone;
    }
}

@end

Cómo deshabilitar la celda:

[cell enableCell:NO withText:NO];

[cell enableCell:NO withText:YES withDisclosureIndicator:YES];

Cómo habilitar la celda:

[cell enableCell:YES withText:NO];

[cell enableCell:YES withText:YES withDisclosureIndicator:YES];

Espero que te ayude.

Aqib Mumtaz
fuente
1

para rápido

cell.isUserInteractionEnabled = false
Nilesh
fuente
Esto no afecta la apariencia de la celda.
Womble