J'ai un J'aimerais déclencher une action lorsque l'utilisateur clique sur le champ de texte (étiquette) à l'intérieur de la vue de la table (Imaginez avoir un lien hypertexte avec une action personnalisée dans chaque cellule de table. ). P> J'ai créé un J'ai essayé d'utiliser un Voici le code de l'étiquette personnalisée: p> NSTableView basé sur la vue code>. Chaque vue dans la table a un champ de texte personnalisé.
NStextField code> Sous-classe pour attraper des événements de la souris. Cependant, ils ne tirent que le deuxième clic, pas le premier clic. p>
nsbutton code> et qui incendie tout de suite. p>
@implementation HyperlinkTextField
- (void)mouseDown:(NSEvent *)theEvent {
NSLog(@"link mouse down");
}
- (void)mouseUp:(NSEvent *)theEvent {
NSLog(@"link mouse up");
}
- (BOOL)acceptsFirstResponder {
return YES;
}
- (BOOL)acceptsFirstMouse:(NSEvent *)theEvent {
return YES;
}
@end
5 Réponses :
Le comportement que vous voyez est dû au fait que la vue de table est le premier répondeur, ce qui devrait être ou la ligne ne changera pas lorsque vous cliquez sur l'étiquette - il s'agit du comportement qu'un utilisateur attend lorsque vous cliquez sur une rangée de table. Au lieu de sous-classer l'étiquette, je pense qu'il serait préférable de sous-classer la vue de la table et de remplacer Mousedown: là-bas. Après avoir appelé la mise en œuvre de Super's de Mousedown :, Vous pouvez effectuer un test HIT pour vérifier que l'utilisateur a cliqué sur l'étiquette.
@implementation CustomTable - (void)mouseDown:(NSEvent *)theEvent { [super mouseDown:theEvent]; NSPoint point = [self convertPoint:theEvent.locationInWindow fromView:nil]; NSView *theView = [self hitTest:point]; if ([theView isKindOfClass:[NSTextField class]]) { NSLog(@"%@",[(NSTextField *)theView stringValue]); } } @end
Merci, je vais essayer ça. Une question: le premier clic fonctionne avec un nsbutton (la ligne de table n'est pas sélectionnée dans ce cas). Y a-t-il un moyen d'imiter ce comportement?
Il y a probablement, mais je ne le sais pas. J'aurais pensé que revenir oui pour acceptation du poste de police et / ou acceptation du dépendance.
Si vous voulez le comportement que vous obtenez avec un bouton, pourquoi pas simplement utiliser un bouton? Vous pouvez éteindre la frontière et cela ressemblerait à une étiquette sans frontière quand même. Si vous souhaitez une bordure, vous pouvez intégrer un bouton sans bordure dans une NSBOX.
Étant donné que l'utilisation d'une étiquette facilite l'alignement avec d'autres étiquettes à l'intérieur de la vue. En outre, l'utilisation d'un bouton contient d'autres effets secondaires indésirables, tels que l'affichage d'une couleur d'arrière-plan différente lorsque vous appuyez sur la touche.
Il s'est avéré que La touche pour que l'étiquette réagisse au premier clic comme un bouton est de remplacer Documentation: P>
NSTAbleView code> et
NSOULTINEVIEW CODE> G traitez le premier statut de répondeur pour
NStextField code> Instances différemment que pour un
nsbutton code >. P>
[NSREPONDER validateProposePRester: inventent:] code> Pour retourner
Oui code> dans le cas de ma coutume Classe de champ de texte. P>
avait le même problème. La réponse acceptée ici n'a pas fonctionné pour moi. Après beaucoup de lutte, il a fonctionné magiquement lorsque j'ai sélectionné "Aucun" comme contre la valeur par défaut "Régulier" avec l'autre option étant "Liste des sources" pour l'option "Might" de la vue Table de la table dans IB! P>
Edit: La réponse acceptée s'avère trompeur car la méthode doit être surchargée pour la vue de tableau et non pour le champ de texte, car la réponse suggère. Il est donné plus clairement à https://stackoverflow.com/a/13579469/804616 mais en tout cas, étant plus Spécifique se sent un peu hacky. P>
Il semble que cela fonctionne réellement. J'essayais de déclencher la mouseUp, mais cela ne fonctionne pas avec l'une ou l'autre des méthodes. Mousedown travaille avec les deux
Bien que cela fonctionne, et si vous souhaitez que la vue Table de la table utilise la liste de la liste de la liste de la liste de la liste de la liste des images?
Dans la même situation, incorporer un nsbutton code> avec
transparent code> défini sur
true / oui code> a travaillé pour moi.
class LinkButton: NSTextField {
var clickableButton:NSButton?
override func viewDidMoveToSuperview() {
let button = NSButton()
self.addSubview(button)
//setting constraints to cover the whole textfield area (I'm making use of SnapKit here, you should add the constraints your way or use frames
button.snp_makeConstraints { (make) -> Void in
make.edges.equalTo(NSEdgeInsetsZero)
}
button.target = self
button.action = Selector("pressed:")
button.transparent = true
}
func pressed(sender:AnyObject) {
print("pressed")
}
Vous utilisez la fenêtre.MakefirStresponseur (myTextfield) pour commencer à éditer le champ de texte. Vous envoyez ce message à partir du remplacement de Mousedown (WithEvent Theevent: NSEvent) Méthode P>