我试图通过直接从按钮执行来解除所呈现的视图控制器,而不是仅仅为它制作单独的方法,但我迷失了如何使其工作,或者甚至可能。
感谢所提供的任何帮助!
我正在尝试的代码:
[dismissButton addTarget:self action:@selector(dismissViewControllerAnimated:YES completion:NULL) forControlEvents:UIControlEventTouchUpInside];
我不想做的事情:
- (void)dismissThis
{
[self dismissViewControllerAnimated:YES completion:NULL];
}
答案 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
类别。