通过动作将PanGesture应用于另一个类的uiview

时间:2013-06-11 11:47:39

标签: iphone ios ipad uiview uipangesturerecognizer

我有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动作,但我不想在iDragHomeViewController中写一行并处理iDrag类中的所有内容

可能吗?

请帮助。

2 个答案:

答案 0 :(得分: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:方法时,已经释放了拖动对象。

您在viewDidLoad中初始化iDrag对象,但不会保留。 (它不是一个成员变量,并没有在其他地方使用....)。 ARC释放viewDidLoad iDrag对象的结尾。

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

我假设你有充分的理由,比如多个视图使用处理等等......如果是这种情况,那么更好的方法就是制作iDrag对象单例(共享实例)。

答案 1 :(得分:0)

得到了答案

只需将iDrag对象声明为属性

即可
@property(nonatomic,strong) iDrag *drag;