Ситуация:Crash - UITableViewCell подкласс KVO'ing UITableView.panGestureRecogonizer.state
Я подклассов UITableViewCell, потому что мне нужно добавить пользовательские кнопки действий по обе стороны от UITableViewCell. Есть определенные ситуации, когда мне нужно вернуть UITableView в нормальное состояние (скрыть пользовательские кнопки действий). , например. Когда пользователь прокручивается вверх в UITableView. Для этого я добавляю свой пользовательский UITableViewCell в качестве наблюдателя из состояния UIPangestureRecognizer, содержащего UITableView.
Проблема:
Когда суя UIViewController, который содержит UITableView и пользовательские UITableViewCells я получаю следующее сообщение об ошибке:
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'An instance 0x7b21b920 of class UIScrollViewPanGestureRecognizer was deallocated while key value observers were still registered with it. Current observation info: ( Context: 0xb83618, Property: 0x7b3e13b0> Context: 0xb83618, Property: 0x7b3e13b0> Context: 0xb83618, Property: 0x7b3e13b0> Context: 0xb83618, Property: 0x7b3e13b0>)'
который, очевидно, о том, что UIPanGestureRecognizer в настоящее время освобождаться до пользовательских UITableViewCell-х находятся.
Вопрос:
Где я должен удалить пользовательские UITableViewCell в качестве наблюдателя UIPanGestureRecognizer в UITableView, чтобы я не столкнуться это исключение?
Код:(.. Я надеюсь, что это не слишком много кода, чтобы прочесать я прошу прощения, если он есть)
CustomUITableViewCell.m
#pragma mark - Setter Methods
- (void)setContainingTableView:(UITableView *)containingTableView
{
if (self.isObservingContainingTableViewPanGestureRecognizer)
{
self.observingContainingTableViewPanGestureRecognizer = NO;
[_containingTableView.panGestureRecognizer removeObserver:self forKeyPath:kUITableViewPanGestureRecognizerStateKeyPath];
}
_containingTableView = containingTableView;
if (containingTableView)
{
self.observingContainingTableViewPanGestureRecognizer = YES;
[containingTableView.panGestureRecognizer addObserver:self forKeyPath:kUITableViewPanGestureRecognizerStateKeyPath options:0 context:UITableViewPanGestureRecogonizerContext];
}
}
#pragma mark -
#pragma mark - Overrides
- (void)didMoveToSuperview
{
[super didMoveToSuperview];
self.containingTableView = nil;
UIView * view = self.superview;
while (view)
{
if ([view isKindOfClass:[UITableView class]])
{
self.containingTableView = (UITableView *)view;
break;
}
view = view.superview;
}
}
- (void)dealloc
{
self.containingTableView = nil;
}
#pragma mark -
#pragma mark - Key Value Observing
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if (context == UITableViewPanGestureRecogonizerContext)
{
if ([keyPath isEqual:kUITableViewPanGestureRecognizerStateKeyPath])
{
UIPanGestureRecognizer * panGestureRecognizer = (UIPanGestureRecognizer *)object;
if (panGestureRecognizer.state == UIGestureRecognizerStateBegan)
{
CGPoint velocity = [panGestureRecognizer velocityInView:self.contentCellView];
if (fabs(velocity.y) >= fabs(velocity.x))
{
[self.scrollView setContentOffset:CGPointZero animated:YES];
}
}
}
}
else {
[super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
}
}
#pragma mark -
Как всегда, любая помощь очень ценится! Кроме того, если кому-то нужна дополнительная информация, пожалуйста, дайте мне знать.
EDIT:
Как ни странно, пользовательский метод dealloc UITableViewCell, называется и обычай UITableViewCell удаляется в качестве наблюдателя, прежде чем я исключение выбрасывается.
в readyForReuse ?? – HMHero
@HMHero, я получаю такое же исключение, если удалить пользовательский UITableViewCell в качестве наблюдателя в prepareForReuse. – Jonathan