代码之家  ›  专栏  ›  技术社区  ›  alexhajdu

缺少委托阻止调用将使应用程序崩溃。在使用@协议时,是否可以声明类似@可选的块?

  •  0
  • alexhajdu  · 技术社区  · 12 年前

    我正在为可拖动对象编写类。

    平移完成后,我想使用块来委派它。 它工作得很好,但在使用@协议时,我应该如何设置@可选之类的内容? 因为如果我不调用myObject.didEndPanning应用程序崩溃。

    // MyClass.h
    
    #import <Foundation/Foundation.h>
    
    typedef void (^DelegateBlock)(void);
    
    @interface AHDraggableObject : UIView
    
    - (id)initDragableView:(UIView *)view inView:(UIView *)parentView withBorderOffset:(int)offset;
    
    @property (nonatomic, strong) UIView *holder;
    @property (nonatomic, weak) DelegateBlock didEndPanning;
    
    @end
    
    // MyClass.m
    
    - (void)handlePanning:(UIPanGestureRecognizer *)sender
    {
        CGPoint translation = [sender translationInView:_parentView];
        sender.view.center = CGPointMake(sender.view.center.x + translation.x, sender.view.center.y + translation.y);
        [sender setTranslation:CGPointMake(0, 0) inView:_parentView];
    
        [self checkBondaries:sender withOffset:_offset inView:_parentView];
    
        //  end of pan - invoke event
        if (sender.state == UIGestureRecognizerStateEnded)
        {
            _didEndPanning();
        }
    }
    

    呼叫

    //ViewController.m
    -(void)viewDidLoad {
        _drag = [[MRShape alloc] initDragableView:_testImageView inView:self.view withBorderOffset:40];
        _drag.didEndPanning = ^
        {
         // if didEndPanning call is missing, app crash !
        };
    }
    
    1 回复  |  直到 12 年前
        1
  •  3
  •   user23743 user23743    12 年前

    您可以检查块是否已设置:

    if (sender.state == UIGestureRecognizerStateEnded && _didEndPanning)
    {
        _didEndPanning();
    }