我正在尝试从完成块发送回调用侦听器。我在自定义UIView
&完成块从父视图控制器执行(其中UIView
子视图)。这是代码......(我不想使用委托)
ViewController.h
typedef void(^ExportCompletion)(BOOL success, NSURL* url);
@property (nonatomic, copy) ExportCompletion exportBlock;
-(void) exportCompletionBlock:(ExportCompletion)callback;
初始化&在ViewController.m
-(void) exportCompletionBlock:(ExportCompletion)callback
{
if (callback) {
self.exportBlock = callback;
}
}
来自完成处理程序的实现(调用)(它也在ViewController.m
)
-(void)blockAlertAppear:(float)progress{
if(EXPORT_SESSION_COMPLETED!=progress)
doing something...
if(EXPORT_SESSION_COMPLETED==progress){
self.exportBlock(YES, mCompositor.url);
}
}
回复uicustomview中的操作... CustomUIView.m
-(void) initUIView{
[(ViewController*)[[self superview] nextResponder] exportCompletionBlock:^(BOOL success, NSURL *url) {
if (success) {
doing something...
}
}];
我可以在这里使用委托,但我想使用回叫。回电话我很新。我想知道为什么我遇到了崩溃(它来自背景 - 所以不明白的原因)&如何优化代码?
答案 0 :(得分:2)
如果[(ViewController*)[[self superview] nextResponder]
返回nil,则可能是崩溃的原因。但是使用[[self superview] nextResponder]并不是一个好习惯。让我们尝试完成处理程序。我试着举个例子。
ViewController.h
typedef void(^ExportCompletion)(BOOL success, NSURL* url);
@property (nonatomic, copy) ExportCompletion exportBlock;
在您的viewcontroller ViewController.m
中,无需指定exportCompletionBlock
。只需在需要时分配。例如,您在CustomView中有一个委托,该委托在ViewController.m
。
在CustomUIView.h
添加此
typedef void(^ExportCompletion)(BOOL success, NSURL* url);
@protocol CustomUIViewDelegate <NSObject>
- (void) startExport:(ExportCompletion)completionBlock;
@end
从您想要的活动中呼叫您的代表,例如
在CustomUIView.m
- (IBAction)ButtonTapped:(UIButton *)sender {
[self.delegate startExport:^(BOOL success, NSURL *url) {
if (success) {
doing something...
}
}];
}
在您的ViewCOntroller.m
代码中保持相同但幻灯片修改有点
与之相同
-(void)blockAlertAppear:(float)progress{
if(EXPORT_SESSION_COMPLETED!=progress)
doing something...
if(EXPORT_SESSION_COMPLETED==progress){
self.exportBlock(YES, mCompositor.url);
}
}
在ViewCOntroller.m
- (void) startExport:(ExportCompletion)completionBlock{
self.exportBlock = completionBlock;
the thing you want to do...
}
这是一种处理完成块的方法。我不知道它能为你提供多少帮助。它只是实现代码的一种新方法。 &安培;它可以帮助您防止使用[[self superview] nextResponder]
视图依赖。
答案 1 :(得分:1)
为什么你的上一个方法调用“initUIView”???如果您未添加到superview([viewController.view addsubview:yourView]),则初始化View,View没有Superview。我想,如果你在NSLog中打印[(ViewController *)[[self superview] nextResponder],你会看到Nil。这是崩溃的原因