【问题标题】:How to add a method to UITextField & UITextView?如何向 UITextField 和 UITextView 添加方法?
【发布时间】:2011-05-25 20:12:59
【问题描述】:

我想在UITextField & UITextView 的方法中加入类似的内容。

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

我该怎么做?我知道我可以同时为UITextFieldUITextView 创建类别,但是可以一次性完成吗?

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

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

【问题讨论】:

  • 为什么需要一个类别?你也可以用一个简单的方法来做到这一点,只需将文本字段或文本视图作为参数传递。
  • @Nick Weaver,我不需要类别,但是创建一个类别,然后在 .pch 文件中包含该类别可以让我轻松地在任何文件中重用相同的方法。

标签: iphone objective-c ios uitextfield uitextview


【解决方案1】:

这样的事情呢?

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

【讨论】:

    【解决方案2】:

    您可以为其中的每一个创建一个类别。

    接口文件:

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

    实现文件:

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

    这是添加这些的方法,但我还没有测试过功能。

    【讨论】:

    • 谢谢。我就是这么想的。但是,我也必须为UITextView 这样做,所以我想知道如何一次性做到这一点。我想出了一个solution to do it in one shot。但是,您的解决方案虽然需要更多代码且可扩展性较差,但更直接且更易于理解。
    【解决方案3】:

    就像@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

    【讨论】:

    • Swizzling 在这里并不真正适用,因为他试图添加一种方法,而不是更改现有方法。
    • 一击,我的意思是用一个协议将它添加到两个类中,而不是创建两个类别,一个用于UITextView,一个用于UITextField。我听说一个协议类似于 Ruby 模块,但是在 Ruby 模块中,我可以实现该方法。在协议中,似乎只能声明方法。我也可以在协议中实现该方法吗?一切皆有可能。
    • 你只能像你说的那样使用协议定义方法。至于@josh 所说的,他是对的。 Method Swizzling 也不是我想要的。我有点匆忙地在这里回答。我会更新的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多