Как я могу «поделиться» фрагментами кода по всему моему приложению? - PullRequest
2 голосов
/ 17 марта 2019

Я работаю над простым приложением.Это приложение имеет различные текстовые поля, для которых требуется кнопка «Готово» на панели инструментов.

В настоящее время эта панель инструментов требует <10 строк кода, но мне не нравится тот факт, что для каждого текстового поля в каждом viewController мне нужно добавить телинии. </p>

Итак, есть ли способ сократить эту «настройку панели инструментов»?В идеале мне нужно было бы вызвать единственный метод, содержащий все, что мне нужно:

[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 Ответ

1 голос
/ 17 марта 2019

То, что вы хотите, это панель инструментов, которая заботится о собственном нажатии кнопки.Вы можете создать один из них.

@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], чтобы взять текстовое поле и добавить себя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...