如何在整个应用程序中“共享”代码?

时间:2019-03-17 17:12:20

标签: objective-c

我正在开发一个简单的应用程序。此应用程序具有多个文本字段,这些文本字段需要工具栏中的“完成”按钮。

当前,此工具栏需要<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的话,它确实可以工作,但这有点违反了我要在这里实现的目的。

1 个答案:

答案 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]以使用文本字段,然后添加自身。