2

我试图通过直接从按钮执行它来关闭呈现的视图控制器,而不是为它制作一个单独的方法,但我不知道如何让它工作,或者它是否可能。

感谢您提供的任何帮助!

我正在尝试的代码:

[dismissButton addTarget:self action:@selector(dismissViewControllerAnimated:YES completion:NULL) forControlEvents:UIControlEventTouchUpInside];

我不想做的事情:

- (void)dismissThis
{
    [self dismissViewControllerAnimated:YES completion:NULL];
}
4

3 回答 3

1

它不会那样工作。从UIControls的文档中addTarget:action:forControlEvents:

动作消息可以可选地包括作为参数的发送者和事件,以该顺序。

所以你有三个可能的选择器:

@selector(name)
@selector(nameWithParam:)
@selector(nameWithParam: otherParam:)

如果您的选择器是@selector(dismissViewControllerAnimated:completion:),它将使用发送者而不是动画 BOOL 和事件而不是完成处理程序块调用,这将使您的应用程序崩溃。

编辑以澄清崩溃的原因: 通过发送消息dismissViewControllerAnimated:completion:复制完成块。copy事件对象没有实现copy,你会得到一个NSInvalidArgumentException.

于 2013-07-12T03:23:14.217 回答
1

Apple 的标准 API 不支持它,但很容易通过 UIControl 上的类别添加此功能。JTTargetActionBlock添加了这个功能。它也可以作为 Cocoapod 使用

[button addEventHandler:^(UIButton *sender, UIEvent *event) {
    [self dismissViewControllerAnimated:YES completion:nil];
} forControlEvent:UIControlEventTouchUpInside];
于 2013-07-12T03:49:37.973 回答
0

我喜欢处理这个问题的方法是子类UIButton化并添加一个基于块的操作:

@interface BlockButton : UIButton

@property (nonatomic, copy) void (^onPress)();

@end

@implementation BlockButton

-(id) initWithFrame:(CGRect)frame
{
    if(self = [super initWithFrame:frame]) {
        [self addTarget:self
                 action:@selector(pressed:)
       forControlEvents:UIControlEventTouchUpInside];
    }
    return self;
}

-(void) pressed:(id)sender
{
    if(self.onPress)self.onPress();
}

@end

然后代替

[dismissButton addTarget:self action:@selector(dismissViewControllerAnimated:YES completion:NULL) forControlEvents:UIControlEventTouchUpInside];

- (void)dismissThis
{
    [self dismissViewControllerAnimated:YES completion:NULL];
}

您可以使用:

dismissButton.onPress = ^{
    [self dismissViewControllerAnimated:YES completion:NULL];
};

UIButton如果您真的不想要自定义按钮类,我相信您可以稍微调整一下以使用类别。

于 2013-07-12T03:52:52.560 回答