2011-05-25 5 views
2

Je veux mettre quelque chose comme ça dans une méthode pour UITextField & UITextView.Comment ajouter une méthode à UITextField & UITextView?

- (void)changeKeyboardType:(UIKeyboardType)keyboardType { 
    paymentTextView.keyboardType = UIKeyboardTypeAlphabet; 
    [paymentTextView resignFirstResponder]; 
    [paymentTextView becomeFirstResponder]; 
} 

Comment faire? Je sais que je peux créer des catégories pour les deux UITextField & UITextView mais est-il possible de le faire en un seul coup?

En un coup, je veux dire ajouter aux deux classes avec un protocole au lieu de faire deux catégories, un pour UITextView & un pour UITextField. J'ai entendu dire qu'un protocole est similaire à un module Ruby, mais dans un module Ruby, je peux implémenter la méthode. Dans un protocole, il semble seulement que je peux déclarer la méthode mais ne pas l'implémenter. Puis-je également implémenter la méthode dans le protocole, puis inclure ce protocole dans UITextField & UITextView?

How to add a method to an existing protocol in Cocoa? est proche mais pas tout à fait.

+0

Pourquoi avez-vous besoin d'une catégorie pour cela? Vous pouvez aussi le faire avec une méthode simple, il suffit de passer le textfield ou textview en paramètre. –

+0

@Nick Weaver, je n'ai pas besoin d'une catégorie, mais faire une catégorie et ensuite inclure la catégorie dans le fichier '.pch' me permet de réutiliser facilement la même méthode dans n'importe quel fichier. – ma11hew28

Répondre

4

Qu'en est-il de quelque chose comme ça?

// UIView+UITextInputTraits.h 

@interface UIView (UITextInputTraits) 
- (void)changeKeyboardType:(UIKeyboardType)keyboardType;  
@end 


// UIView+Additions.m 

#import "UIView+UITextInputTraits.h" 

@implementation UIView (UITextInputTraits) 

- (void)changeKeyboardType:(UIKeyboardType)keyboardType { 
    if ([self conformsToProtocol:@protocol(UITextInputTraits)]) { 
     id<UITextInputTraits> textInput = (id<UITextInputTraits>)self; 
     if (textInput.keyboardType != keyboardType) { 
      [self resignFirstResponder]; 
      textInput.keyboardType = keyboardType; 
      [self becomeFirstResponder]; 
     } 
    } 
} 

@end 
0

Comme @Josh a dit, la méthode swizzling n'est pas ce que vous cherchez. Cependant, ce que j'avais réellement à l'esprit (Mon mauvais pour ne pas chercher plus avant de soumettre une réponse) est d'ajouter une méthode à l'exécution sur UITextView et UITextField. Même si cela a besoin d'un peu plus de code pour la mise en œuvre, il peut vous donner le genre de one-shot que vous recherchez (Vous créez une méthode et de l'ajouter à la fois UITextView & UITextField lors de l'exécution)

Voici un blog à ce sujet:

http://theocacao.com/document.page/327

http://www.mikeash.com/pyblog/friday-qa-2010-11-6-creating-classes-at-runtime-in-objective-c.html

+0

Swizzling ne s'applique pas vraiment ici puisqu'il essaie d'ajouter une méthode, pas de modifier une méthode existante. –

+0

D'un coup, je voulais dire l'ajouter aux deux classes avec un protocole au lieu de faire deux catégories, une pour 'UITextView' & une pour' UITextField'. J'ai entendu dire qu'un protocole est similaire à un module Ruby, mais dans un module Ruby, je peux implémenter la méthode. Dans un protocole, il semble seulement que je peux déclarer la méthode. Puis-je également implémenter la méthode dans le protocole? Tout est possible. – ma11hew28

+0

Vous pouvez uniquement définir la méthode en utilisant des protocoles comme vous l'avez dit. Quant à ce que @josh a dit, il a raison. Méthode Swizzling n'était pas ce que je cherchais non plus. J'ai précipité ma réponse ici. Je vais le mettre à jour –

3

Pour chacun d'eux, vous pouvez créer une catégorie.

fichier d'interface:

@interface UITextField (ChangeKeyboard) 
- (void)changeKeyboardType:(UIKeyboardType)keyboardType; 
@end 

fichier de mise en œuvre:

@implementation UITextField (ChangeKeyboard) 
- (void)changeKeyboardType:(UIKeyboardType)keyboardType { 
    self.keyboardType = keyboardType; 
    [self resignFirstResponder]; 
    [self becomeFirstResponder]; 
} 
@end 

Ce serait le moyen d'ajouter ceux-ci, mais je ne l'ai pas testé la fonctionnalité.

+0

Merci. C'est ce que je pensais. Mais, je vais devoir faire ça pour 'UITextView' aussi, alors je me demandais comment faire ça en un coup. J'ai trouvé une [solution pour le faire en une seule fois] (http: // stackoverflow.com/questions/6130315/comment-ajouter-une-méthode-à-uitextfield-uitextview/6132880 # 6132880). Cependant, votre solution, bien qu'elle prenne plus de code et soit moins extensible, est plus simple et plus facile à comprendre. – ma11hew28

Questions connexes