Копирование поведения кнопки UIAlertController - PullRequest
0 голосов
/ 22 апреля 2019

Я создаю пользовательские диалоги для своего приложения и кое-что копирую UIAlertController в некоторых аспектах.Как мне реализовать такое поведение, когда при щелчке любого действия в предупреждении / диалоговом окне контроллер отклоняется.

Как Apple делает это, не заставляя нас вручную указывать для каждого обработчика действий, что он должен отклонять контроллер представления?

Мне нравятся они один класс контроллера представления:

@interface MyAlertViewController : UIViewController
- (void)addAction:(MyAlertAction *) action;

//...

И один класс для действий:

@interface MyAlertAction : NSObject
- (instancetype)initWithTitle:(nullable NSString *)title handler:(void (^)(MyAlertAction *action))handler;

РЕДАКТИРОВАТЬ: Как я это сделал, принимая в соответствии сответ обратной связи:

//MYAlertViewController.m
- (void)viewDidLoad {    
    for (int i = 0; i < self.actions.count; i++) {
        MYAlertAction *action = self.actions[i];

        button = [[UIButton alloc] initWithFrame:CGRectZero];
        button.tag = i;//this here is how I link the button to the action
        [button addTarget:self action:@selector(executeAction:) forControlEvents:UIControlEventTouchUpInside];
        [actionStackView addArrangedSubview:button];

        [self.actionsStackView addArrangedSubview:actionLayout];
    }
}

- (void)executeAction:(UIButton *) sender{
    [self dismissViewControllerAnimated:YES completion:^{
        //this is where the button tag comes in handy
        MYAlertAction *actionToExecute = self.actions[sender.tag];
        actionToExecute.actionHandler();
    }];
}

1 Ответ

0 голосов
/ 22 апреля 2019

Как Apple делает это, не заставляя нас вручную указывать для каждого обработчика действий, что он должен закрыть контроллер представления?

Вы путаете две разные вещи:

  • Последний параметр инициализации UIAlertAction, параметр handler, который вы можете установить снаружи и который должен запускаться после нажатия кнопки и после отмены предупреждения. Это блок .

  • Фактическое действие кнопки *1016*, которое клиент не может установить или увидеть. Это настраивается контроллером оповещений. Это селектор .

Итак, вы играете роль UIAlertController. В вашем

- (instancetype)initWithTitle:(nullable NSString *)title handler:(void (^)(MyAlertAction *action))handler;

клиент передает вам первое упомянутое действие , блок, и вы сохраняете его для последующего выполнения. Но действие second , действие кнопки, селектор, полностью зависит от вас, когда вы создаете кнопку в ответ на этот вызов.

Поэтому, когда вы настраиваете кнопку, просто настройте ее с парой цель / действие, которая вызывает метод вашего контроллера представления, как и для любой кнопки. В методе, когда вызывается, контроллер представления отменяет себя, а в обработчике завершения отмены вызывает блок.

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