Учебник о том, как перетащить элемент из UITableView в UITableView [закрыто]

Я бился головой об этом некоторое время, и я понял это. Я хочу вернуть сообществу, так как я получил большую помощь от этого сайта :).

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

Мастер UIViewUIView с UITableViewПользовательский UITableViewCellПользовательский UIView, который копируется (объект Person в моем случае)UIView с UITableViewПользовательский UITableViewCellПользовательский UIView, который копируется (объект Person в моем случае)

Объект person, который у меня есть в UITableView, - это объект, который я хочу перетащить из одной таблицы в другую. Мне было сложнее всего понять, как вынуть предмет из стола и перетащить его одним плавным движением. Дольше всего мне потребовалось бы два прикосновения, чтобы выполнить операцию.

Начиная с объекта Person, это простой объект, содержащий изображение. Мне пришлось реализовать свой собственный метод touchesMoved, чтобы изменить центральное положение человека, когда происходит перетаскивание.

-(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
    if( m_moveable == YES ){
        UITouch *touch = [touches anyObject];
        CGPoint location = [touch locationInView:self.superview];

        if( 0 < location.x-50 && location.x+50 < 768 ){ 
            if( 0 < location.y-50 && location.y+150 < 1004 ){
                self.center = location;
            }
        }
    }
}

При инициализации я установил флаг userInteractionEnabled объекта Person в значение NO, чтобы любые щелчки в таблице не попадали в объект Person. В этом случае объект Person будет перемещаться в пределах таблицы, которая побеждает цель.

Следующий объект - мой пользовательский UITableViewCell. Этот объект отвечает за то, чтобы поймать первое касание пользователя. То, что он должен сделать, это поймать это прикосновение и «вытолкнуть» Человека наружу. Person - это одно из подпредставлений, принадлежащих пользовательскому UITableViewCell.

 - (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    UIView *parent = self.superview.superview.superview;    

    Person *s = nil;
    for( UIView *child in self.subviews ){
        if( [child isKindOfClass:[Person class]] ){
            s = child;
            s removeFromSuperview];
            break;
        }        
    }

    if( s != nil ){
        self.userInteractionEnabled = NO;
        s.userInteractionEnabled = YES;
        UITableView *subParent = self.superview;   //EDIT #1
        subParent.scrollEnabled = NO;              //EDIT #1

        [parent addSubview:s];
        //[self touchesEnded:touches withEvent:event]; //EDIT #1
    }
}

Важно отметить, что флаг userInteractionEnabled переворачивается в вышеуказанном методе. До прикосновения объект Person находится вне пределов касания человека. После того, как пользовательская ячейка перехватывает движение, Person освобождается, добавляя его в представление родителя, а затем активируется (userInteractionEnabled = YES). Затем объект Person «рождается» и может самостоятельно обрабатывать движения.

Это имеет один незначительный недостаток в том, что объект Person мигает в верхнем левом углу, но затем сразу же падает на палец пользователя.

Финальная часть этого дизайна заключается в том, что мастер UIView должен обрабатывать «сенсорный переход». Когда пользователь касается таблицы и объект Person появляется, приложение должно осознавать, что фокус должен быть удален из таблицы и направлен на объект Person. Способ, которым это было сделано, заключается в том, что метод hitTest в главном UIView был перегружен следующим.

- (UIView*) hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    UIView *rv = nil;
    for(UIView *child in self.subviews){
        if( [child isKindOfClass:[Person class]] ){
            rv = child;
            child.center = point;
            break;
        }
    }
    if( rv == nil ){
        rv = [super hitTest:point withEvent:event];
    }   
    return rv;
}

То, как работает этот код, заключается в том, что, когда Человек выпадает из таблицы, он не фокусируется на прикосновениях. Прикосновение «принадлежит» UITableView, из которого выскочил человек. Метод hitTest является ключом к перефокусировке этого прикосновения. Регулярно система проверяет, какой UIView является фокусом прикосновения. Метод hitTest вызывается системой для идентификации этого UIView. Когда Person присоединен к главному представлению, эта функция hitTest выполняет итерацию по всем подпредставлениям и обнаруживает присутствие Person и возвращает его как «доминирующий» объект, к которому прикоснулись. Любое движение вашего пальца будет немедленно сообщено человеку, а не UITableView.

Это мужество реализации. Чтобы UITableView «поймал» движущийся объект, теперь просто, и я оставлю это для вас, чтобы попробовать! Если у вас есть какие-либо вопросы, пожалуйста, напишите их!

РЕДАКТИРОВАТЬ # 1 Удаление объекта Person оказывается сложнее, чем я думал :). Мне пришлось добавить строку, чтобы предотвратить прокрутку UITableView при перемещении родителя, потому что UITableView всасывает все события движения.
Функция touchesEnded запускается в пользовательском классе UITableViewCell.
MJ

Ответы на вопрос(1)

Ваш ответ на вопрос