2015-10-09 7 views
1

J'utilise un fichier .xib pour ma cellule dans une vue de table. À l'intérieur du .xib, est une autre vue (cellBackgroundView), et un bouton. Lorsque je lance l'application, et cliquez sur le bouton, il ne répond pas du tout. Au lieu de cela, il appelle la méthode didSelectedRowAtIndexPath de tableView qui amène un autre contrôleur de vue. En utilisant la hiérarchie de vue de débogage de Xcode, j'ai découvert que j'avais une vue superposant tous les boutons (voir la photo ci-jointe: cette vue superposée est en surbrillance). Cette vue (appelée backgroundView) qui recouvre mon bouton est une vue, dans une vue. J'ai l'impression que lorsque vous placez une vue dans une vue et que vous placez un bouton dans la vue initiale, le bouton n'est pas appelé car il se trouve sous la hiérarchie de la vue.Le bouton ne répond pas dans la cellule Table View

Comment résoudre ce problème? Est-il possible de déplacer la vue en arrière-plan à l'arrière de la hiérarchie de vue pour que les boutons soient réactifs?

Debug Afficher la hiérarchie:
enter image description here

Structure de .xib
enter image description here

Répondre

1

Il existe un certain nombre de méthodes d'UIView qui vous permettent de modifier la hiérarchie des vues.

bringSubviewToFront: 
sendSubviewToBack: 
insertSubview:atIndex: 
insertSubview:aboveSubview: 
insertSubview:belowSubview: 
exchangeSubviewAtIndex:withSubviewAtIndex: 

Étant donné que vos vues sont déjà insérées dans votre superview, vous pouvez facilement appeler exchangeSubviewAtIndex:withSubviewAtIndex: ou sendSubviewToBack une fois pour chaque vue dans l'ordre que vous voulez.

+0

Ces méthodes sont très utiles lors de la création/modification de hiérarchies de vue par programmation. Cependant, alors qu'ils pourraient aider à surmonter le problème d'OP je suggérerais de fixer la hiérarchie de vue (et/ou les cadres) dans le xib plutôt que d'écrire du code supplémentaire pour le résoudre. – lekksi

1

Deux choses que vous pouvez vérifier

1) Avez-vous une méthode déléguée pour la taille des cellules et la hauteur retournée est-elle correcte? Sauf si Clip Subviews est activé pour le UITableViewCell, le contenu de la cellule peut être visible en dehors de son cadre, mais les parties qui sont en dehors du cadre de la cellule n'enregistrent pas les interactions de l'utilisateur.

2) Un autre élément de vue est-il plus haut dans la hiérarchie (plus bas dans la liste XCode que vous avez publiée) chevauchant le bouton? Les simulateurs iOS Debug -> Color Blended Layers peuvent vous aider à repérer cela.

Edit: Si j'interprète correctement les screenshots ajoutés, vous avez probablement la question mentionnée dans l'option 1) ci-dessus. Si les autres éléments apparaissant dans la capture d'écran sont ceux répertoriés comme sous-vues du Cell Background View, ils sont pour la plupart en dehors du cadre de la vue parente et ne reçoivent donc pas d'événements tactiles. Si l'image de l'arrière-plan est correcte, vous pouvez déplacer les autres éléments en tant qu'enfants pour Feed Cell directement. De plus, la liste des éléments suggère que vous utilisez UIView comme élément parent. Je ne connais pas le fonctionnement interne de votre application, mais si vous n'utilisez cette vue que dans un UITableViewCell, vous pouvez envisager de créer une vue Table View Cell dans le fichier xib. Cela réduira un peu de ballonnement et vous permettra de configurer certaines propriétés pour la cellule dans le xib.

+0

J'ai réellement un élément de vue plus haut dans la hiearchy. Comment pousser cette vue à l'envers? Cette vue est appelée backgroundView (voir la question mise à jour). –

+0

@ JoshO'Connor vous pouvez faire glisser et déposer les éléments dans la liste sur votre deuxième capture d'écran. Notez que les éléments les plus bas dans la liste sont ceux qui ont un index de vue plus élevé ('Profile Image View' a un index inférieur à' Username Label'), et seront donc au-dessus de n'importe quel élément précédent. Voir ma réponse mise à jour pour plus de détails. – lekksi

0

Peut-être que vous avez oublié votre bouton assigner au code

+0

Il n'y a pas de code de travail. J'ai créé une vue simple et ça répond. Il ne répond pas parce que c'est dans une vue, dans une vue (devait faire cela pour autolayout) –

0

Je suppose que Feed Cell est une sous-classe de UITableViewCell et cellBackgroundView est la propriété contentView de cette cellule.
Si oui, la propriété de cellules backgroundView doit être derrière votre cellBackgroundView (le docs indique: UITableViewCell ajoute la vue d'arrière-plan en tant que sous-vue derrière toutes les autres vues et utilise son emplacement de trame actuel.).
Vous pouvez définir la propriété de cellules backgroundView = nil et voir si elle est toujours présente dans la hiérarchie de vue. Si oui, vous ajoutez un backgroundView personnalisé sur le dessus des autres vues de cellules quelque part.
Pour vérifier cela, vous pouvez lire la hiérarchie de subview de votre cellule dans votre méthode tableView:cellForRowAtIndexPath: avec quelque chose comme NSArray *svs = cell.subviews; (en supposant cell est le tableViewCell) et définir un point d'arrêt derrière cette déclaration.
svs contient généralement d'abord le UITableViewCellContentView, et au-dessus le _UITableViewCellSeparatorView. Les cellules backGroundView ne seront pas montrées. Vous pouvez vérifier votre hiérarchie de vue.
Si par hasard il y a un backgroundView personnalisé sur le dessus, vous pourriez - comme une solution de contournement, pas une solution - apporter le contentView à l'avant en envoyant à la cellule bringSubviewToFront: avec l'argument contentView. Ensuite, le bouton devrait répondre.

0

Dans votre Structure de Xib Placez votre bouton en dessous de la vue qui est d'abord la vue est ajoutée à superView puis le bouton, puis votre bouton va fonctionner.

ou vous pouvez coder

-(void)viewDidLayoutSubviews{ 

[self.view insertSubview:yourButton aboveSubview:cellBackgroundView]; 

} 

espère que cela aidera.

0

Ajoutez-vous un UIButton par code?
Si oui, vous devez vous assurer addSubview: en cell.contentView et non en cell.

Vous pouvez également essayer d'appliquer la classe CellBackground à une vue à l'intérieur de contentView, pas directement à contentView.

0

vous pouvez utiliser cette méthode.

[cell.contentView bringSubviewToFront:yourButton]; 

après que si vous souhaitez sauvegarder en arrière-plan peut alors utiliser Tou méthode sendSubviewToBack:. Après l'ajout de cette méthode, votre bouton ne répond pas, définissez userIntractionEable sur la vue d'ensemble du bouton.