J'affiche dans un groupe un tableview
contenu analysé à partir de XML. Je veux désactiver l'événement click dessus (je ne devrais pas du tout pouvoir cliquer dessus) Le tableau contient deux groupes. Je souhaite désactiver la sélection pour le premier groupe uniquement, mais pas pour le deuxième groupe. En cliquant sur la première ligne du deuxième groupe navigates
de mon tube player view
.
Comment puis-je uniquement sélectionner des groupes ou des lignes spécifiques?
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if(indexPath.section!=0)
if(indexPath.row==0)
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:tubeUrl]];
}
Merci.
la source
tableView:shouldHighlightRowAtIndexPath:
est une nouvelleUITableViewDelegate
méthode qui renvoie unBOOL
basé sur si oui ou non le passéindexPath
doit être mis en évidence. Si vous construisez pour 6.0 et versions ultérieures, je recommande fortement cette nouvelle API.cell!.selectionStyle = .None
force qui déballe la cellule, vous permettant d'accéder à ses propriétés.Si vous souhaitez rendre une ligne (ou un sous-ensemble de lignes) non sélectionnable , implémentez la
UITableViewDelegate
méthode-tableView:willSelectRowAtIndexPath:
(également mentionnée par TechZen). Si leindexPath
ne doit pas être sélectionnable , retourneznil
, sinon retournez leindexPath
. Pour obtenir le comportement de sélection par défaut, il vous suffit de renvoyer leindexPath
passé à votredelegate
méthode, mais vous pouvez également modifier la sélection de ligne en renvoyant un autreindexPath
.exemple:
la source
À partir d'iOS 6, vous pouvez utiliser
Si vous revenez
NO
, il désactive à la fois la mise en surbrillance de la sélection et les séquences déclenchées du storyboard connectées à cette cellule.La méthode est appelée quand une touche descend sur une ligne. Revenir
NO
à ce message interrompt le processus de sélection et ne fait pas perdre à la ligne actuellement sélectionnée son aspect sélectionné lorsque le toucher est enfoncé.Référence du protocole UITableViewDelegate
la source
Aucune des réponses ci-dessus ne résout vraiment le problème correctement. La raison en est que nous voulons désactiver la sélection de la cellule mais pas nécessairement des sous-vues à l'intérieur de la cellule.
Dans mon cas, je présentais un UISwitch au milieu de la ligne et je voulais désactiver la sélection pour le reste de la ligne (qui est vide) mais pas pour le commutateur! La bonne façon de le faire est donc dans la méthode
où une déclaration du formulaire
désactive la sélection pour la cellule spécifique tout en permettant à l'utilisateur de manipuler le commutateur et donc d'utiliser le sélecteur approprié. Ce n'est pas vrai si quelqu'un désactive l'interaction de l'utilisateur via le
méthode qui prépare simplement la cellule et ne permet pas l'interaction avec le commutateur UIS.
De plus, en utilisant la méthode
afin de désélectionner la cellule avec une déclaration de la forme
affiche toujours la ligne sélectionnée pendant que l'utilisateur appuie sur la vue de contenu d'origine de la cellule.
Juste mes deux cents. Je suis sûr que beaucoup trouveront cela utile.
la source
willSelectRowAtIndexPath
a le même problème, les sous-vues ne sont pas sélectionnables.Vous interceptez les sélections avec ces méthodes de source de données.
Dans ces méthodes, vous vérifiez si la ligne sélectionnée est celle que vous souhaitez sélectionner. Si c'est le cas, prenez une mesure, sinon, ne faites rien.
Malheureusement, vous ne pouvez pas désactiver la sélection pour une seule section. C'est toute la table ou rien.
Vous pouvez toutefois définir la
selectionStyle
propriété des cellules du tableau surUITableViewCellSelectionStyleNone
. Je pense que cela rendra la sélection invisible. Combiné avec les méthodes ci-dessus qui devraient rendre les cellules complètement inertes du point de vue de l'utilisateur.Edit01:
Si vous avez un tableau dans lequel seules certaines des lignes peuvent être sélectionnées, il est important que les cellules des lignes sélectionnables soient visuellement distinctes des lignes non sélectionnables. Le bouton d'accessoire chevron est le moyen par défaut de le faire.
Quoi que vous fassiez, vous ne voulez pas que vos utilisateurs essaient de sélectionner des lignes et pensent que l'application a mal fonctionné car la ligne ne fait rien.
la source
Help -> Developer documentation
, puis copiez ces noms de méthode dans le champ de recherche pour voir comment cela fonctionne. La documentation du développeur contient également un exemple de code.Pour Swift 4.0 par exemple:
la source
Vous devez faire quelque chose comme ce qui suit pour désactiver la sélection de cellules dans la
cellForRowAtIndexPath
méthode:Pour afficher la cellule grisée, mettez ce qui suit dans la
tableView:WillDisplayCell:forRowAtIndexPath
méthode:Une méthode vous permet de contrôler l'interactivité, l'autre vous permet de contrôler l'apparence de l'interface utilisateur.
la source
Pour arrêter uniquement la sélection de certaines cellules, utilisez:
En plus d'empêcher la sélection, cela arrête également tableView: didSelectRowAtIndexPath: appelé pour les cellules qui l'ont défini.
la source
userInteractionEnabled
NO sur une cellule (plus clairement, un indexPath), l'interaction utilisateur de certaines AUTRES cellules est désactivée. Je n'ai aucune idée pourquoi cela se produit chaque fois que j'utiliseuserInteractionEnabled
sur des cellules de vue tableau. Est-ce un bug connu ou j'ai fait quelque chose de mal?if [indexPath row] == 0
) àNO
entableView:cellForRowAtIndexPath:
après dequeueing la cellule. Cela fonctionne généralement bien au début. Ensuite, après plusieurs appels dereloadData
, tout à coup, la cinquième ligne est interdite d'interaction, puis la quatrième ligne .. Je ne peux pas savoir quand cela se produira. Le tout semble aléatoire.if [indexPath row] == 0) { set to NO } else { set to YES }
Vous pouvez utiliser la
tableView:willDisplayCell
méthode pour effectuer tous les types de personnalisation d'une tableViewCell.Dans ce code ci-dessus, l'utilisateur ne peut sélectionner que la première ligne dans la deuxième section de la tableView. Le reste de toutes les lignes ne peut pas être sélectionné. Merci! ~
la source
Pour rapide:
la source
Ma solution basée sur un modèle de données:
la source
Pour swift 4.0 Cela fera l'affaire. Il désactivera la cellule dans la méthode didSelectRowAtIndexPath mais gardera les sous-vues cliquables.
la source
return indexPath.row == clickableIndex ? indexPath : nil
:, garde votre code un peu plus propre ;-)Utilisez ceci pour donner à la cellule un aspect désactivé et non sélectionnable:
Important: notez qu'il ne s'agit que d'une propriété de style et ne désactive pas réellement la cellule. Pour ce faire, vous devez vérifier
selectionStyle
dans l'didSelectRowAtIndexPath:
implémentation de votre délégué:la source
J'aime la réponse de Brian Chapados ci-dessus. Cependant, cela signifie que la logique peut être dupliquée dans cellForRowAtIndexPath puis dans willSelectRowAtIndexPath qui peuvent facilement se désynchroniser. Au lieu de dupliquer la logique, vérifiez simplement le style de sélection:
la source
J'ai trouvé cela pratique car il fonctionne avec des tables statiques et dynamiques. Je ne mets l'indicateur de divulgation que sur les cellules que je souhaite autoriser la sélection.
la source
sur Xcode 7 sans codage, vous pouvez simplement faire ce qui suit:
Dans la vue hiérarchique, sélectionnez Cellule de vue Table. (La cellule est imbriquée sous Scène de contrôleur de vue de table> Contrôleur de vue de table> Vue de table. Vous devrez peut-être divulguer ces objets pour voir la cellule de vue de table)
Dans l'inspecteur des attributs, recherchez le champ intitulé Sélection et sélectionnez Aucun. inspecteur d'attribut Avec cette option, la cellule n'obtiendra pas de surbrillance visuelle lorsqu'un utilisateur la tapera.
la source
FACILE
Utilisez simplement
cell.userInteractionEnabled = YES;
la cellule si elle peut naviguer etcell.userInteractionEnabled = NO;
sinonla source
Implémentez uniquement la méthode
tableView:willSelectRowAtIndexPath:
dans la source de données de votre table. Si vous souhaitez que la ligne du chemin soit mise en surbrillance, renvoyez l'indexPath donné. Si vous ne le faites pas, retournez zéro.Exemple de mon application:
La bonne chose à ce sujet est que
shouldPerformSegueWithIdentifier:sender:
cela ne sera pas appelé si la méthode ci-dessus renvoie zéro, bien que je répète le test ci-dessus juste pour être complet.la source
Pour Xcode 6.3:
la source
Je suis d'accord avec la réponse de Bryan
si je fais
alors les sous-vues dans la cellule ne seront pas interagies avec l'utilisateur.
Sur l'autre site, mise en
déclenchera la méthode didSelect malgré la non mise à jour de la couleur de sélection.
L'utilisation de willSelectRowAt est la façon dont j'ai résolu mon problème. Exemple:
la source
à part
tableView.allowsMultipleSelection = true
vous devrez désélectionner le reste des cellules de la section lors de la sélection:la source
pour swift 3.0, vous pouvez utiliser le code ci-dessous pour désactiver l'interaction de l'utilisateur avec la cellule UITableView
la source