0

私はViewController iDragHomeViewController

そしてもう一つ

NSObjectクラスiDrag

「iDragHomeViewController.m」

- (void)viewDidLoad
{
    [super viewDidLoad];

    UIView *dragView = [[UIView alloc]initWithFrame:CGRectMake(100, 100, 200, 200)];
    [dragView setBackgroundColor:[UIColor greenColor]];
    [self.view addSubview:dragView];

    iDrag *drag = [[iDrag alloc]init];
    [drag makeDraggableView:dragView];
}

「iDrag.m」

-(void)makeDraggableView: (UIView *)dragView {

    UIPanGestureRecognizer *panRecognizer = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(cellPan:)];
    [dragView addGestureRecognizer:panRecognizer]; 

}

- (void)cellPan:(UIPanGestureRecognizer *)iRecognizer {

   UIView *viewToDrag = [[UIView alloc]init];
   viewToDrag = iRecognizer.view;

   CGPoint translation = [iRecognizer translationInView:[viewToDrag superview]];
   viewToDrag.center = CGPointMake(iRecognizer.view.center.x + translation.x,
                                         iRecognizer.view.center.y + translation.y);
   [iRecognizer setTranslation:CGPointMake(0, 0) inView:[viewToDrag superview]];
}

ここで私が試みているのは、PanGesture を適用することにより、クラス内でこの " dragView"(に属するiDragHomeViewController) をドラッグ可能にすることです。iDragしかし、コードはクラッシュしています。

別のクラスで Pan アクションを処理するために使用することを提案する人がいるとは思いませんが、クラスだけNSNotificationで 1 行を書き込んでiDragHomeViewControllerすべてを処理したくありiDragません。

出来ますか ??

助けてください。

4

2 に答える 2

1

確かにエラー出力を知る必要がありますが、推測です...

UIGestureRecognizer doc から:

- (id)initWithTarget:(id)target action:(SEL)action
target parameter:
An object that is the recipient of action messages sent by the receiver when it recognizes a gesture. nil is not a valid value.

それがアプリがクラッシュする理由です。cellPan:レコグナイザーがメソッドの呼び出しを試行している間に、ドラッグ オブジェクトは既に解放されています。

iDrag オブジェクトを初期化し、viewDidLoad保持されません。(これはメンバー変数ではなく、他の場所では使用されません....)。viewDidLoadiDrag オブジェクトの末尾は ARC によって解放されます。

正当な理由がない限り、パン ジェスチャの処理を担当する他のオブジェクトを作成しません。また、View Controller がジェスチャ認識エンジンの作成とイベントの処理を担当するようにします。

処理が複数のビューで使用されているなど、それには本当に正当な理由があると思います...その場合は、iDragオブジェクトをシングルトン(共有インスタンス)にすることをお勧めします。

于 2013-06-11T12:15:33.097 に答える
0

答えを得た

iDragオブジェクトをプロパティとして宣言するだけです

@property(nonatomic,strong) iDrag *drag;
于 2013-06-12T10:16:08.420 に答える