Comment faire apparaître un UITableViewCell désactivé?

Réponses:

164

Vous pouvez simplement désactiver les champs de texte de la cellule pour les griser:

Swift 4.x

cell!.isUserInteractionEnabled = false
cell!.textLabel!.isEnabled = false
cell!.detailTextLabel!.isEnabled = false
Symétrique
la source
17
Ou un peu plus court:cell.userInteractionEnabled = cell.textLabel.enabled = cell.detailTextLabel.enabled = NO;
Thomas Kekeisen
51
plus court mais plus moche
sports
25

Une extension Swift qui fonctionne bien dans le contexte dans lequel je l'utilise; Votre kilométrage peut varier.

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

Maintenant, c'est juste une question d'appeler myCell.enable(truthValue).

Kevin Owens
la source
22

Grâce à @Ajay Sharma, j'ai compris comment faire UITableViewCell apparaître un désactivé:

// 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];

Et puis, pour désactiver réellement la cellule:

cell.userInteractionEnabled = NO;
ma11hew28
la source
Oui, bien sûr, vous pourriez faire la même chose de cette façon aussi, en définissant l'alpha :)
Ajay Sharma
18

Essayez d'utiliser une petite astuce:

Définissez simplement l'alpha de la cellule. Mettez certaines conditions comme vos propres exigences et définissez l'alpha.

cell.alpha=0.2;

Si cela ne fonctionne pas, comme vous l'aimez alors, utilisez la deuxième astuce,

Prenez simplement une image de la taille de la cellule avec un fond gris avec un fond transparent, ajoutez simplement cette image dans l'image sur le contenu de la cellule. Comme ça:

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

Bien que je ne sois pas sûr du chemin, cela répondra sûrement à vos besoins. Cela donnera une sorte d'illusion dans l'esprit de l'utilisateur que la cellule est désactivée. Essayez simplement d'utiliser cette solution. J'espère que cela résoudra votre problème.

Ajay Sharma
la source
5
cell.alpha = 0,2 - ne fonctionne pas pour moi. cell.ContentView.Alpha = 0.2 a travaillé pour moi
Michal Dobrodenka
La même chose ici que l' établissement cell.alpha - ne fonctionne pas, la mise en cell.ContentView.alpha fait le travail
infinity_coding7
4

Grande extension de Kevin Owens, voici ma correction pour travailler avec 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
la source
Utilisez .isUserInteractionEnabled dans Swift 3.0
Matias Masso
4

Swift 4.X

Belle extension de Kevin Owens, je corrige le comportement de la cellule.

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

Comment appeler ça: -

cell.enable(on: switch.isOn)

Ashu
la source
2

J'ai créé l'extension suivante pour activer / désactiver UITableViewCell, il est très pratique de l'utiliser. Créez l'extension UITableViewCell avec "UITableViewCell + Ext.h" contenant les éléments suivants.

@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" contient ce qui suit.

@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

Comment désactiver la cellule:

[cell enableCell:NO withText:NO];

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

Comment activer la cellule:

[cell enableCell:YES withText:NO];

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

J'espère que cela vous aide.

Aqib Mumtaz
la source
1

pour rapide

cell.isUserInteractionEnabled = false
Nilesh
la source
Cela n'affecte pas l'apparence de la cellule.
Womble