Учебное пособие по перетаскиванию элемента из UITableView в UITableView - программирование
Подтвердить что ты не робот

Учебное пособие по перетаскиванию элемента из UITableView в UITableView

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

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

  • Мастер UIView
    • UIView с 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;
            }
        }
    }
}

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

Следующий объект - это мой пользовательский UITableViewCell. Этот объект отвечает за то, чтобы поймать пользователя при первом касании. То, что он должен делать, это поймать это прикосновение и "поп" Человека. Человек является одним из подзонов, принадлежащих к пользовательскому 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

4b9b3361

Ответ 1

Привет, мне удалось создать drag & падение строки в UITableView в другой строке той же таблицы. Я создал uiImageView, представляющий движущийся элемент (который не был удален из таблицы) и привязал его к самому самому UIView, чтобы он перетащил на весь экран. Вот несколько сообщений о тех болях, с которыми я столкнулся:

Надеюсь, это поможет ^^