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但是代码崩溃了。

我知道有些人会建议我使用NSNotification在另一个类中处理 Pan 动作,但我不想写一行并只在 Class中iDragHomeViewController处理所有内容。iDrag

可能吗 ??

请帮忙。

4

2 回答 2

1

为了确保我需要知道错误输出,但猜测......

来自 UIGestureRecognizer 文档:

- (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并且不保留。(它不是成员变量,也没有在其他任何地方使用......)。iDrag 对象的末端viewDidLoad由 ARC 释放。

除非我有充分的理由,否则我不会让任何其他对象负责处理平移手势。并使视图控制器负责创建手势识别器和处理事件。

我认为您有很好的理由,例如处理由多个视图使用等...如果是这种情况,那么更好的方法是使 iDrag 对象单例(共享实例)。

于 2013-06-11T12:15:33.097 回答
0

得到了答案

只需要将iDrag对象声明为属性

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