我正在开发一个简单的应用程序。此应用程序具有多个文本字段,这些文本字段需要工具栏中的“完成”按钮。
当前,此工具栏需要<10行代码,但我不喜欢这样的事实,对于每个viewController中的每个文本字段,我都需要添加这些行。
那么,有没有办法缩短此“工具栏设置”?理想情况下,我需要调用一个包含我所需要的所有方法:
[self addDefaultToolbar:field]
但是在我需要的任何地方再次添加此方法似乎有点“肮脏”(也许这还不够清楚,self
意味着控制器内有一个名为addDefaultToolBar
的方法)。
这就是我尝试过的:
我做了一个漂亮的文件夹,一个标头和一个.m
文件。在标题中输入:
#ifndef UIUtils_h
#define UIUtils_h
#import <UIKit/UIKit.h>
@interface UIUtils : NSObject
-(void)addDefaultToolbar:(UITextField *)field;
@end
#endif /* UIUtils_h */
然后在.m
文件中输入:
#import "UIUtils.h"
@implementation UIUtils
-(void)addDefaultToolbar:(UITextField *)field{
UIToolbar *textFieldToolbar = [[UIToolbar alloc] init];
[textFieldToolbar sizeToFit];
UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(doneClick)];
UIBarButtonItem *flexSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil];
[textFieldToolbar setItems:[NSArray arrayWithObjects:flexSpace, doneButton, nil] animated:NO];
field.inputAccessoryView = textFieldToolbar;
}
-(void)doneClick
{
[[UIApplication sharedApplication] sendAction:@selector(resignFirstResponder) to:nil from:nil forEvent:nil];
}
@end
然后从需要的地方调用它,就像这样:
#import "UIUtils.h"
UIUtils *utils = [[UIUtils alloc] init];
[utils addDefaultToolbar:field];
现在,不幸的是,该按钮不起作用。应该关闭键盘,但不是。其次,我不知道我是否做对了。
如何正确执行此操作?
编辑:
进一步的研究表明,doneClick
方法根本没有被调用。如果将doneClick
添加到viewController的话,它确实可以工作,但这有点违反了我要在这里实现的目的。
答案 0 :(得分:1)
您想要的是一个工具栏,它可以自己按按钮。您可以创建其中之一。
@interface MYDefaultToolBar : UIToolbar
@end
@implementation MYDefaultToolBar
- (instancetype)init
{
self = [self initWithFrame: CGRectZero];
if (self) {
[self sizeToFit];
UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone
target:self action:@selector(doneClick)];
UIBarButtonItem *flexSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace
target:self action:nil];
[self setItems:[NSArray arrayWithObjects:flexSpace, doneButton, nil] animated:NO];
}
return self;
}
-(void)doneClick
{
[[UIApplication sharedApplication] sendAction:@selector(resignFirstResponder) to:nil from:nil forEvent:nil];
}
@end
然后,您希望能够将其添加到文本字段中。我可能会建议手动执行此操作:
textField.inputAccessoryView = [MYDefaultToolBar new];
很明显,它正在修改inputAccessoryView(因此,如果同一代码中的其他内容 也修改了inputAccessoryView,则很明显会有冲突)。但是您也可以使用类别来执行此操作,尤其是在类别比较复杂的情况下。
@interface UITextField (AddDefaultToolBar)
- (void)my_addDefaultToolBar;
@end
@implementation UITextField (AddDefaultToolBar)
- (void)my_addDefaultToolBar {
self.inputAccessoryView = [MYDefaultToolBar new];
}
或者您可以修改-[MYDefaultToolBar init]
以使用文本字段,然后添加自身。