Проведите пальцем по строке в табличном представлении, щелкнув по другому, выбрав пролистанный - PullRequest
1 голос
/ 09 июля 2010

У меня есть табличное представление, и всякий раз, когда я пролистываю строку в разделе A и после этого выбираю строку в разделе B, он думает, что я выбрал строку прокрутки в разделе A! Я установил точку останова для проверки и на 100% уверен, что он думает, что это именно та ячейка И что она вызывает ее, когда я выбираю строку в разделе B.

Под проведением пальца я подразумеваю, что вы помещаете палец в какую-то часть ячейки, затем перетаскиваете ее (влево или вправо, не имеет значения) и затем отпускаете. Это не вызывает didSelectRowAtIndexPath, так как это не тап.

Пример:
Проведите по указателю A.1
Нажмите на указательный путь B.4
ОС вызывает tableView: didSelectRowAtIndexPath: A.1

Я что-то не так делаю? Что может пойти не так?

Полный код, который обрабатывает прикосновения в определенных ячейках:

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    RDLogString(@"(%p) Received touches began", self);
    moveCount = 0;
    UITouch * touch = [touches anyObject];
    touchBegin = [touch locationInView: nil];
    [[self nextResponder] touchesBegan: touches withEvent: event];
}

- (void) touchesMoved: (NSSet * const)touches withEvent:(UIEvent * const)event {
    RDLogString(@"(%p) Received touches moved", self);
    moveCount++;
    [[self nextResponder] touchesMoved: touches withEvent: event];
}

- (void) touchesEnded: (NSSet * const)touches withEvent:(UIEvent * const)event {
    RDLogString(@"(%p) Received touches ended", self);
    if(![self checkUserSwipedWithTouches: touches]){
        [[self nextResponder] touchesEnded: touches withEvent: event];
    }
}

- (BOOL) checkUserSwipedWithTouches: (NSSet * const) touches {
    CGPoint touchEnd = [[touches anyObject] locationInView: nil];
    NSInteger distance = touchBegin.x - touchEnd.x;

    // This code shows an animation if the user swiped
    if(distance > SWIPED_HORIZONTAL_THRESHOLD){
        [self userSwipedRightToLeft: YES];
        return YES;
    } else if (distance < (-SWIPED_HORIZONTAL_THRESHOLD)) {
        [self userSwipedRightToLeft: NO];
        return YES;
    }

    return NO;
}

1 Ответ

1 голос
/ 13 июля 2010

Я исправил это, когда был обнаружен и обработан свайп, вместо того, чтобы ничего не отправлять, я теперь отправляю touchesCancelled, что имеет большой смысл в ретроспективе, я должен признать, но не было действительно ясно, чтосделай это.Я не смог найти надлежащую документацию о том, что делать, если вы не хотите, чтобы действие было обработано.

Код, который работает:

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    moveCount = 0;
    UITouch * touch = [touches anyObject];
    touchBegin = [touch locationInView: nil];
    [[self nextResponder] touchesBegan: touches withEvent: event];
}

- (void) touchesMoved: (NSSet * const)touches withEvent:(UIEvent * const)event {
    moveCount++;
    [[self nextResponder] touchesMoved: touches withEvent: event];
}

- (void) touchesEnded: (NSSet * const)touches withEvent:(UIEvent * const)event {
    // If we DO NOT handle the touch, send touchesEnded
    if(![self checkUserSwipedWithTouches: touches]){
        [[self nextResponder] touchesEnded: touches withEvent: event];
    } else { // If we DO handle the touch, send a touches cancelled. 
        self.selected = NO;
        self.highlighted = NO;
        [[self nextResponder] touchesCancelled: touches withEvent: event];
    }
}
...