从@selector中关闭视图控制器而不创建单独的方法

时间:2013-07-12 03:12:09

标签: iphone ios objective-c

我试图通过直接从按钮执行来解除所呈现的视图控制器,而不是仅仅为它制作单独的方法,但我迷失了如何使其工作,或者甚至可能。

感谢所提供的任何帮助!

我正在尝试的代码:

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

我不想做的事情:

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

3 个答案:

答案 0 :(得分:1)

它不会像那样工作。来自UIControl s addTarget:action:forControlEvents:的文档:

  

操作消息可以选择按顺序包括发件人和事件作为参数。

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

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

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

编辑以澄清崩溃的原因: dismissViewControllerAnimated:completion:通过发送copy消息来复制完成块。事件对象未实现copy,您将获得NSInvalidArgumentException

答案 1 :(得分:1)

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

[button addEventHandler:^(UIButton *sender, UIEvent *event) {
    [self dismissViewControllerAnimated:YES completion:nil];
} forControlEvent:UIControlEventTouchUpInside];

答案 2 :(得分: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类别。