【问题标题】:Copying UIAlertController button behaviour复制 UIAlertController 按钮行为
【发布时间】:2019-04-22 09:06:27
【问题描述】:

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

【问题讨论】:

  • 屏幕上的每个按钮都与一个动作相关联。当按钮被触发时,控制器被解除并触发动作
  • 顺便说一句,如果执行是按照你说的顺序。关闭具有动作引用的控制器后,动作如何执行?
  • 我不喜欢使用标签和索引。我个人会将每个块存储在按钮本身中。

标签: ios objective-c


【解决方案1】:

Apple 如何在不让我们手动为每个动作处理程序指定它应该关闭视图控制器的情况下做到这一点?

你混淆了两个不同的东西:

  • UIAlertAction 的最后一个初始化参数,handler 参数,您可以从外部设置该参数,并在点击按钮和解除警报后运行。它是一个

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

所以现在,扮演 UIAlertController 的角色。在你的

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

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

因此,当您配置按钮时,只需使用调用视图控制器方法的目标/操作对来配置它,就像任何按钮一样。在方法中,当被调用时,视图控制器会关闭自己,并在关闭的完成处理程序中调用块。

【讨论】:

  • 在这种情况下,解除回调必须知道要执行哪个操作。要知道我必须以某种方式将单击的按钮与需要发生的操作联系起来。这是因为所有按钮选择器都将通过 ViewController 中的一个选择器。我可以通过使用它们的标签或某物对按钮进行编号,然后使用该编号从存储在 ViewController 中的动作的数组中获取动作来做到这一点。我的代码更加“纠结”,因为 MyAlertAction 实际上构建了按钮,而 MyAlertViewController 从那里获取了按钮。
  • 那么现在你需要我告诉你如何存储和检索块吗?
  • 我很好奇苹果是怎么做到的。因为它们的处理程序块不在公共接口中,但 AlertViewController 类知道它。我只是在 MyAlertAction 接口中将其声明为 public。他们可能“滥用”一些机制来执行其他类的私有方法?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-19
  • 1970-01-01
相关资源
最近更新 更多