2017-07-04 20 views
0

完了ブロックからコールバックリスナーを送信しようとしています。カスタムでコールバックを開始します。UIView &補完ブロックは親ビューコントローラ(UIViewサブビュー)から実行されます。ここでは、コードがある... ViewController.m目的-Cコールバックが不幸なバックグラウンドクラッシュで動作しない

-(void) exportCompletionBlock:(ExportCompletion)callback 
{ 
    if (callback) { 
     self.exportBlock = callback; 
    } 
} 

実装にコールバックのViewController.h

typedef void(^ExportCompletion)(BOOL success, NSURL* url); 
@property (nonatomic, copy) ExportCompletion exportBlock; 
-(void) exportCompletionBlock:(ExportCompletion)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

[(ViewController*)[[self superview] nextResponder]は、クラッシュの原因かもしれないnilを返します。しかし、[[self superview] nextResponder]を使うのは良い方法ではありません。完了ハンドラを試してみましょう。私はあなたに例を挙げています。あなたのViewController ViewController.mexportCompletionBlockを割り当てる必要でViewController.h

typedef void(^ExportCompletion)(BOOL success, NSURL* url); 
@property (nonatomic, copy) ExportCompletion exportBlock; 

でコールバックの

宣言。必要なときに割り当ててください。たとえば、CustomViewにデリゲートがあり、これはViewController.mに実装されています。あなたのCustomUIView.h

はあなたViewCOntroller.mコードでCustomUIView.m

- (IBAction)ButtonTapped:(UIButton *)sender { 
    [self.delegate startExport:^(BOOL success, NSURL *url) { 
     if (success) { 
      doing something... 
     } 
    }]; 
} 

は同じまま、あなたではなく、スライド変更aに

のように、ご希望のイベントからこの

typedef void(^ExportCompletion)(BOOL success, NSURL* url); 

@protocol CustomUIViewDelegate <NSObject> 
- (void) startExport:(ExportCompletion)completionBlock; 
@end 

呼び出すデリゲートを追加します少し

それはこれが完了ブロックを処理する方法ですViewCOntroller.m

- (void) startExport:(ExportCompletion)completionBlock{ 
    self.exportBlock = completionBlock; 
    the thing you want to do... 
} 

にデリゲートを実装

-(void)blockAlertAppear:(float)progress{ 
    if(EXPORT_SESSION_COMPLETED!=progress) 
     doing something... 
    if(EXPORT_SESSION_COMPLETED==progress){ 
     self.exportBlock(YES, mCompositor.url); 
    } 
} 

したのと同じ。それがどれくらいあなたを助けてくれるのか分かりません。コードを実装するための新しい方法です。 & [[self superview] nextResponder]ビューの依存関係の使用を防ぐのに役立ちます。

1

最後のメソッドが「initUIView」を呼び出すのはなぜですか?新しいビューを初期化すると、スーパービュー([viewController.view addsubview:yourView])に追加されない前に、ビューにはSuperviewがありません。 NSLogの[(ViewController *)[[self superview] nextResponder]を印刷すると、Nilが表示されます。そしてクラッシュの理由

関連する問題