复制UIAlertController按钮行为

时间:2019-04-22 09:06:27

标签: ios objective-c

我正在为我的应用创建自定义对话框,并在某些方面复制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 :(得分:0)

  

Apple如何做到这一点,而又不让我们手动为每个动作处理程序指定应关闭视图控制器的内容?

您正在混淆两件事:

  • UIAlertAction的最后一个初始化参数handler参数,您可以从外部设置该参数,该参数将在敲击按钮且解除警报后运行。这是一个 block

  • 实际的按钮的操作,客户端无法设置或查看。它由警报控制器配置。这是一个选择器

现在,扮演UIAlertController的角色。在您的

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

客户端将您提到的 first 操作交给您,即块,然后将其存储以供以后执行。但是 second 操作(按钮操作,选择器)完全取决于您在创建按钮以响应此调用时的操作。

因此,在配置按钮时,只需使用一个目标/操作对对其进行配置即可,就像调用任何按钮一样,该对对象会调用视图控制器的方法。在方法中,调用时,视图控制器将自身关闭,并在关闭的完成处理程序中调用该块。