我正在尝试创建一个泛型类来管理我的键盘,并向该键盘添加一个工具栏。我有几个要访问这个类的ViewControllers。这个类将有几个方法,其中之一是addToolbar。
让我们在这里做一个小例子:
当我的MainViewController加载时,它将调用viewDidLoad。通常在viewDidLoad上,它必须创建一个新的工具栏,并通过调用setInputAccessoryView:将其添加到每个文本字段。我想要做的只是调用一个单独的类(我们的键盘管理器),但是键盘管理器需要能够访问MainViewController的文本域并能够对它们调用setInputAccessoryView。
这个是可能的吗?如果是这样,我该如何开始使用它呢?
发布于 2011-12-14 03:39:11
调用viewDidLoad,加载我的MainViewController。
- (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以供将来使用,它还创建一个工具栏放在键盘顶部并返回它。然后,我循环并在MainViewController中执行setInputAccessoryView:toolbar。
当点击文本字段时,将调用一个通知(我们之前在keyboard中注册的通知之一),并调用keyboard中的一个本地方法,该方法包含我们需要的数组信息。我仍在努力完成这项工作,但到目前为止进展得很顺利。
发布于 2011-12-13 04:46:57
创建一个正式的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.这甚至可能过于复杂。根据您从视图控制器访问键盘管理器的方式(假设管理器是单例的?),您可以在管理器上简单地使用一个方法,将所有有趣的接口对象传递给该方法。
发布于 2011-12-13 04:44:47
也许您应该考虑将UITextField子类化。然后,您的自定义UITextField的每个实例都将知道如何装饰自己(通过您在子类中定义的方法)。在使用自定义文本字段的视图控制器中,您可以在viewDidLoad:中或在最有意义的地方调用这些自定义方法。
https://stackoverflow.com/questions/8480470
复制相似问题