¿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

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).


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;

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.


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
        }
    }
}

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)


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.


1

para rápido

cell.isUserInteractionEnabled = false

Esto no afecta la apariencia de la celda.
Womble
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.