我正在尝试创建一个用于管理键盘和向该键盘添加工具栏的通用类。我有几个ViewControllers将访问这个类。这个类有几个方法,其中一个方法是addToolbar
。
我们在这里做一个小例子:
加载MainViewController
后,它会调用viewDidLoad
。通常在viewDidLoad
上,它必须创建一个新工具栏并通过调用setInputAccessoryView:
将其添加到每个文本字段。我想要做的只是调用一个单独的类(我们的键盘管理器),但键盘管理员需要能够访问MainViewController
的文本字段并能够在其上调用setInputAccessoryView
。
这可能吗?如果是这样,我该如何开始使用它?
答案 0 :(得分:1)
如何创建一个正式的protocol,KeyboardToolbarClient
或其他东西,有一个必需的方法来公开应该添加工具栏的所有接口项?该协议还可以具有关联通知和发布该通知的方法;采用协议的视图控制器会在它们出现时发布,让经理知道是时候采取行动了。
您希望拥有此功能的任何视图控制器都会实现协议;当看起来你的键盘管理器对象向视图控制器询问列表时,可以通过提供的指针做任何需要的事情。
// 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;
}