目标-C回调不会导致不幸的背景崩溃

时间:2017-07-04 06:14:39

标签: ios objective-c iphone uiview

我正在尝试从完成块发送回调用侦听器。我在自定义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...
    }
}];

我可以在这里使用委托,但我想使用回叫。回电话我很新。我想知道为什么我遇到了崩溃(它来自背景 - 所以不明白的原因)&如何优化代码?

2 个答案:

答案 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。这是崩溃的原因