Objective C用于KB管理的单独类

时间:2011-12-12 20:35:49

标签: objective-c ios class

我正在尝试创建一个用于管理键盘和向该键盘添加工具栏的通用类。我有几个ViewControllers将访问这个类。这个类有几个方法,其中一个方法是addToolbar

我们在这里做一个小例子:

加载MainViewController后,它会调用viewDidLoad。通常在viewDidLoad上,它必须创建一个新工具栏并通过调用setInputAccessoryView:将其添加到每个文本字段。我想要做的只是调用一个单独的类(我们的键盘管理器),但键盘管理员需要能够访问MainViewController的文本字段并能够在其上调用setInputAccessoryView

这可能吗?如果是这样,我该如何开始使用它?

4 个答案:

答案 0 :(得分:1)

如何创建一个正式的protocolKeyboardToolbarClient或其他东西,有一个必需的方法来公开应该添加工具栏的所有接口项?该协议还可以具有关联通知和发布该通知的方法;采用协议的视图控制器会在它们出现时发布,让经理知道是时候采取行动了。

您希望拥有此功能的任何视图控制器都会实现协议;当看起来你的键盘管理器对象向视图控制器询问列表时,可以通过提供的指针做任何需要的事情。

// KeyboardToolbarClient.h

@protocol KeyboardToolbarClient <NSObject>

- (NSArray *) interfaceItemsNeedingToolbar;

- (void) postDidAppearNotification;

@end

NSString * KTCViewControllerDidAppear = @"KTCViewControllerDidAppear";

每个视图控制器都采用KeyboardToolbarClient

#import "KeyboardToolbarClient.h"

@interface MyViewController : UIViewController <KeyboardToolbarClient>

// etc.

@end

@implementation MyViewController

- (NSArray *) interfaceItemsNeedingToolbar {
    return [NSArray arrayWithObjects: textField1, textField2, 
                                      textField3, nil];
}

- (void) postDidAppearNotification {

    [[NSNotificationCenter defaultCenter] postNotificationName:KTCViewControllerDidAppear 
                                                        object:self 
                                                      userInfo:nil];
}

// etc.

这甚至可能过于复杂。根据你从视图控制器访问键盘管理器的方式(可能是管理器是一个单例?),你可以在管理器上有一个方法,你传递所有有趣的接口对象。

答案 1 :(得分:1)

我的MainViewController加载,调用viewDidLoad

- (void)viewDidLoad
{
    [super viewDidLoad];

    keyboard = [[KeyboardScroll alloc]init];
    //we send the text fields to get a tool bar IN ORDER on the view
    NSArray *textFieldArray = [NSArray arrayWithObjects:ccNum, nameOnCard, expMo, expYr, cvv, zip, nickName, pin, nil];
    UIToolbar *toolbar = [keyboard kbToolbarAndNotifReg:textFieldArray];
    for (int i=0;i<[textFieldArray count];i++)
    {
        [[textFieldArray objectAtIndex:i]setInputAccessoryView:toolbar];
    }
}

UIToolbar *toolbar = [keyboard kbToolbarAndNotifReg:textFieldArray];是真正的东西所在。它注册滚动scrollView的通知(尚未完成),然后keyboard保存textFieldArray以备将来使用,它还会创建一个工具栏,以便在键盘顶部移动并返回它。然后我在setInputAccessoryView:toolbar中循环并MainViewController

当点击文本字段时,会调用通知(我们之前在keyboard中注册的通知之一),并在keyboard内调用具有我们需要的数组信息的本地方法。我仍然在努力完成这项任务,但到目前为止它还是很顺利。

答案 2 :(得分:0)

也许您应该考虑对UITextField进行子类化。然后,您的自定义UITextField的每个实例都将知道如何装饰自己(通过您在子类中定义的方法)。在使用自定义文本字段的视图控制器中,您可以在viewDidLoad:中或在最有意义的地方调用这些自定义方法。

答案 3 :(得分:0)

将UITextField子类化为向视图控制器询问输入附件视图可能更容易。为MainViewController提供一个属性globalInputAccessoryView,您可以将其设置为公共输入附件视图。在您的UITextField子类中,执行以下操作:

MyTextField.m

- (UIView *)inputAccessoryView
{
    // Search up the responder chain to find something
    // (presumably MainViewController)
    // that has an input accessory view for me to use.

    UIResponder *responder = [self nextResponder];
    UIView *view = nil;
    for ( ; responder && !view; responder = [responder nextResponder]) {
        if ([responder respondsToSelector:@selector(globalInputAccessoryView)])
            view = [(id)responder globalInputAccessoryView];
    }

    return view;
}