我有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
类中的所有内容
可能吗?
请帮助。
答案 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;