gestureRecognizer shouldReceiveTouch坚持在解除分配视图导致崩溃
我有一个相当简单的UITableView,在堆栈上推新视图。 新视图有一个像这样初始化的gestureRecognizer
@synthesize swipeGestureLeft; - (void)viewDidLoad { swipeGestureLeft = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(toggleViewLeft)]; swipeGestureLeft.numberOfTouchesRequired = 1; swipeGestureLeft.delegate=self; swipeGestureLeft.direction = (UISwipeGestureRecognizerDirectionLeft); [self.view addGestureRecognizer:swipeGestureLeft]; }
我也调用委托方法
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { if (viewShown==1) { return NO; } return YES; }
并在我有dealloc方法
- (void)dealloc { NSLog(@"I AM IN DEALLOC"); swipeGestureLeft.delegate=nil; [self.view removeGestureRecognizer:swipeGestureLeft]; swipeGestureLeft=nil; }
在我的.h文件中
@interface MyViewController : UIViewController <UIGestureRecognizerDelegate>
现在,当我回到我的表视图,现在当我尝试向下滑动我的表查看应用程序崩溃时,视图被取消分配(我可以看到,因为NSLog触发):
[MyViewController gestureRecognizer:shouldReceiveTouch:]: message sent to deallocated instance
如何确保在视图解除分配之后不调用委托方法。
解决:我使用新的iOS7 navigationController.interactivePopGestureRecognizer,并已设置其委托给“自我”。
一旦释放,我没有把它的代表设置为“无”。 正是这个对象保留(不知道是否正确的话)委托调用,而不是swipeLeftGesture对象。 在dealloc中设置它的委托为零。