10
votes

Afficher le menu NssegmentedControl lorsque le segment a cliqué sur, malgré une action définie

J'ai un CNSSEgmentedControl sur mon UI avec 4 boutons. Le contrôle est connecté à une méthode qui appellera différentes méthodes en fonction duquel le segment est cliqué: xxx

segment 4 a un menu attaché à celui-ci dans la méthode eWakefromnib. Je voudrais que ce menu tombe en panne lorsque l'utilisateur clique sur le segment. À ce stade, cela ne tombera que si l'utilisateur clique sur le menu. De mes recherches en ligne, cela est dû à l'action connectée.

Je travaille actuellement autour de cela en utilisant un code pour obtenir le point d'origine du contrôle du segment et sur le menu contextuel à l'aide de NSMENU 'CODE> POPUPCONTEXTMENU: SANSEvent: Foreview Mais ceci est jolie hacktastic et a l'air mal comparée au comportement standard du menu déroulant sous la cellule de commande segmentée.

est là pour que je puisse faire tomber le menu comme il se doit après un simple clic plutôt que de faire le menu contextuel hacky?


2 commentaires

Dans 10.10.2 / XCode 6.3 Le comportement standard du menu est de tomber lorsque l'utilisateur clique sur un segment qui n'a aucune action attachée à celle-ci; et pour exiger un clic-hold lorsque le segment a une ibaction. Étant donné que votre action est "Afficher le menu", vous devriez pouvoir le supprimer.


Comment attachez-vous des actions à des segments individuels?


4 Réponses :


6
votes

Je ne suis pas sûr de la manière intégrée de le faire (bien que ce soit vraiment un trou flagrant dans l'API de CroldControl).

Ma recommandation est de continuer à faire ce que vous faites sur le menu contextuel . Cependant, au lieu d'utiliser l'origine de la commande segmentée, vous pouvez la positionner directement sous le segment (comme vous le souhaitez) en procédant comme suit: xxx

Ce n'est pas parfait ou idéal, Mais il devrait faire le travail et donner l'apparence / le comportement que vos utilisateurs s'attendent.

(comme à l'écart, NssegtedControl vraiment a besoin d'un -rectorCegment: méthode)


1 commentaires

D'accord sur le fait que c'est assez boiteux, il n'y a pas de place intégrée pour le faire. Je l'ai déposé sur radar. Dupe Away: openradar.appspot.com/radar?id=61419



2
votes

widthforSegment: retourne zéro si la taille automatique du segment. Si vous n'êtes pas préoccupé par les API sans papiers, il existe un rectorgegment:

  • (nsrect) segment: (Nsinteger) segment Infirmez: (NSRECT) Cadre;

    mais pour répondre à la question initiale, un moyen plus facile d'obtenir le menu sur laquelle figurer immédiatement est de la sous-classe NssegmiedCell et de retourner 0 pour (encore une fois, sans-papiers)

    • (Double) _MenudelaytimeForcement: (Nsinteger) Segment;

0 commentaires

21
votes

Sous-classe NssegmeredCell, procédé de remplacement ci-dessous et remplacez la classe de cellules dans IB. (Nécessite aucune API privée).

- (SEL)action
{
    //this allows connected menu to popup instantly (because no action is returned for menu button)
    if ([self tagForSegment:[self selectedSegment]]==0) {
        return nil;
    } else {
        return [super action];
    }
}


8 commentaires

Cela fonctionne bien. De loin la solution la plus propre que j'ai vue. Merci!


Belle solution, en effet. Une suggestion mineure: définissez la condition IF sur [Auto-Mensibilisé: [Self sélectionné]]! = Nul ; De cette façon, vous n'avez pas à définir des tags.


Ce genre fonctionne bien. Si le segment n'est pas déjà sélectionné, cliquez dessus, il ne fait rien. Clics après que le segment est sélectionné puis produisez le menu. Je ne vois pas comment cela fonctionne pour vous les gars sans ajuster ce comportement.


Cela devrait être la réponse sélectionnée. Il est bien plus agréable et plus facile que toute autre option.


Travaillé comme un charme pour moi aussi. Merci!


Travaille pour moi aussi. Mais une police cellulaire étrangement change (plus gros)


Comment faites-vous cela à Swift?


Merci - fonctionne parfaitement. Le comportement est exactement ce que je cherchais.



6
votes

C'est la version Swift de la réponse de J Hoover et du MOD par Adam Treble. La substitution n'était pas aussi intuitive que je pensais que ce serait donc, alors cela aidera peut-être quelqu'un d'autre. XXX


1 commentaires

Je l'ai fait, mais pour une raison quelconque, la méthode "get" n'est jamais appelée.