如何将方法添加到UITextField和UITextView?

问题描述:

我想把这样的东西放在方法UITextField & UITextView如何将方法添加到UITextField和UITextView?

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

我该怎么做?我知道我可以为UITextField & UITextView创建类别,但可以一次完成吗?

通过一次拍摄,我的意思是将它添加到两个类与一个协议,而不是两个类别,一个用于UITextView &一个用于UITextField。我听说一个协议类似于Ruby模块,但是在Ruby模块中,我可以实现该方法。在一个协议中,似乎我只能声明该方法,但没有实现它。我是否也可以在协议中实现该方法,然后将此协议包含在UITextField & UITextView

How to add a method to an existing protocol in Cocoa?接近但并不完全。

+0

为什么你需要一个类别呢?你也可以用一个简单的方法来做到这一点,只需将textfield或textview作为参数传递即可。 – 2011-05-25 20:16:37

+0

@Nick Weaver,我不需要一个类别,但是创建一个类别,然后在'.pch'文件中包含类别,可以让我在任何文件中轻松地重复使用同一个方法。 – ma11hew28 2011-05-26 00:16:12

这样的事情呢?

// 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 

就像@Josh说的,方法混合不是你要找的。然而,我实际上想到的是(在提交答案之前不对它进行更深入的研究)是在UITextView和UITextField的运行时添加方法。虽然这需要更多的代码来实现,但它可以给你一种你正在寻找的方法(你创建一个方法并在运行时将它添加到UITextView & UITextField中)

这是一篇博文一下:

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在这里并不适用,因为他试图添加一个方法,而不是改变现有方法。 – 2011-05-25 20:49:01

+0

通过一次拍摄,我的意思是用一种协议将它添加到两个类中,而不是创建两个类别,一个用于“UITextView”,另一个用于“UITextField”。我听说一个协议类似于Ruby模块,但是在Ruby模块中,我可以实现该方法。在一个协议中,似乎我只能声明该方法。我是否也可以在协议中实施该方法?一切皆有可能。 – ma11hew28 2011-05-26 00:21:19

+0

您只能使用像您所说的协议来定义方法。至于@josh说的,他是对的。方法Swizzling不是我正在寻找的。我有点匆忙在这里回答。我会更新它 – 2011-05-26 12:30:52

对于这些,你可以创建一个类别。

接口文件:

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

实现文件:

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

这将是添加这些的方式,但我没有测试的功能。

+0

谢谢。这就是我的想法。但是,我也必须为'UITextView'做到这一点,所以我想知道如何一次完成这个。我想出了一个解决方案(一次性完成)(http:// *。COM /问题/ 6130315 /如何到添加-A-方法到的UITextField-的UITextView/6132880#6132880)。但是,您的解决方案虽然需要更多代码并且扩展性较差,但更直接且更易于理解。 – ma11hew28 2011-05-29 18:51:56