2010-01-09 2 views
2

Je veux ajouter un détecteur de données dans un NSTextField/NSTextView comme dans Mail (par exemple, date, email, URL, etc.).Détecteurs de données dans Cocoa

Est-ce que quelqu'un a une idée de comment faire cela? Je pense que je l'ai vu dans le code source de TextEdit mais quand j'ai vérifié, c'était la version de 2005 et je ne trouve pas le nouveau code source.

Alex

Répondre

2

Vous devez définir la sortie du formateur de l'objet. Les formateurs intégrés sont NSDateFormatter et NSNumberFormatter.

alt text

Vous pouvez définir formatteurs personnalisés en étendant la classe NSFormatter. Il y a un chapitre dans Aaron Hillegass excellent 'Cocoa Programming for Max OS X' sur la création de NSFormatters.

Pour détecter des dates, url, adresse e-mail, etc. dans le corps d'un texte, vous pouvez utiliser le Latent Semantic Mapping Framework. C'est une API publique comme celle de Leopard mais il n'y a pas beaucoup de documentation pour cela. Il existe également un outil de ligne de commande appelé lsm qui vous permet de tester tous les extracteurs personnalisés que vous souhaitez utiliser. Il s'agit d'une API C et non intégrée à Cocoa autant que je sache, vous devrez donc la connecter vous-même.

+0

merci pour la réponse. Mais comment utiliser NSFormatter pour détecter des données dans un texte? par exemple, si j'ai un texte qui va 'Hey comment vas-tu? Rendez-vous dimanche. Mon numéro est 123-555-000 '. Si je recevais ceci dans Mail et que je passerais la souris sur 'dimanche', il me proposerait d'annoncer l'événement à iCal, et si je dépassais '123-555-000', il me proposerait de l'ajouter à un contact ou quelque chose comme ça. Comment puis-je obtenir ce comportement? –

+0

@Alexandre Cassagne: Ah - OK. J'ai ajouté un paragraphe sur le cadre de cartographie sémantique latente que je pense être ce que vous voulez. –

+0

Ça va être dur de travailler avec, mais c'est ce que je cherche. Merci! –

3

Dans Snow Leopard, vous pouvez désormais activer les Data Detectors dans un NSTextView en cochant simplement la case appropriée dans le IB. inspecteur.

+0

Merci - beaucoup plus simple que le XD ci-dessus –