2010-09-17 6 views
2

J'utilise un objet NSTokenField pour entrer des étiquettes. Tout fonctionne bien et il se connecte avec CoreData gérant les balises lorsque l'utilisateur ajoute ou supprime une balise.Redimensionnement de NSTokenField après remplissage avec des jetons

J'ai récemment ajouté une logique pour que le NSTokenField se redimensionne verticalement lorsque l'utilisateur ajoute des balises et qu'elles se séparent à la ligne suivante à l'aide du IFVerticallyExpandingTextField d'Andrew Bowman. Encore une fois tout cela fonctionne bien.

Le problème est que lorsque je dois d'abord peupler le NSTokenField avec des balises, j'en ai besoin pour le redimensionner. Je renseigner le champ en appelant:

[tagField setObjectValue: anArray]; 

Où unTableau est une série d'objets qui représentent une étiquette ou un jeton. Cela appelle la méthode délégué NSTokenField

tokenField:displayStringForRepresentedObject: 

qui retourne la représentation de chaîne pour l'objet passé dans le tableau précédent.

Je dois redimensionner le NSTokenField après tous les appels à displayStringForRepresentedObject. Est-ce que quelqu'un a des idées de notification ou de moyen de savoir que tout est fait? Même une façon d'appeler le redimensionnement entre chaque appel à displayStringForRepresentedObject fonctionnerait probablement.

Merci d'avance.

+0

est-ce que votre taille automatique fonctionne avec autolayout? –

Répondre

0

Vous pouvez essayer quelque chose de similaire à -setNeedsDisplay: et -displayIfNeeded ... c'est-à-dire -setNeedsSizeToFit: et -sizeToFitIfNeeded.

Vous aurez juste besoin d'un indicateur BOOL "needsSizeToFit" et des méthodes -setNeedsSizeToFit: et -sizeToFitIfNeeded. Après avoir défini vos jetons, appelez -setNeedsSizeToFit: YES. Il définira à son tour l'indicateur needsSizeToFit de l'instance, puis si l'indicateur est YES, il appellera [self performSelector: @selector (sizeToFitIfNeeded) withObject: nil afterDelay: 0]. Votre méthode -sizeToFitIfNeeded vérifie si votre indicateur needsSizeToFit est défini sur YES, appelle [self sizeToFit], puis définit l'indicateur needsSizeToFit sur NO.

Mise à jour

est ici a complete class (JLNAutoSizingTokenField) qui fait de base comme décrit redimensionnement automatique ci-dessus. La seule augmentation consistait à appeler cela dans la méthode de délégué mentionné ci-dessus:

- (NSString *)tokenField:(NSTokenField *)aTokenField 
displayStringForRepresentedObject:(id)representedObject 
{ 
    [(JLNAutoSizingTokenField *)aTokenField setNeedsSizeToFit:YES]; 
    return representedObject; 
} 
+0

J'ai commencé à faire quelque chose de similaire mais je me suis heurté à la question de ne pas savoir quand tous mes jetons sont définis. C'est le vrai problème que j'ai. Ils ne sont pas définis après setObjectValue. Ils sont définis uniquement après l'appel de displayStringForRepresentedObject. – skabob11

+0

Ne serait-il pas -displayStringForRepresentedObject: être appelé dans le même trajet à travers le runloop que votre -setObjectValue: call? Si tel est le cas, alors le paramètre -sizeToFitIfNeeded sera appelé lors du prochain déplacement dans la boucle de lancement, * après * tous les appels à -displayStringForRepresentedObject :. –

+0

Dans le pire des cas, un appel à l'aspect désagréable mais fonctionnel à -setNeedsSizeToFit: avec chaque appel à -displayStringForRepresentedObject :. –

Questions connexes