Подтвердить что ты не робот

Коснитесь событий в UITableView?

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

Проблема в том, что когда я нажимаю UITableView, она не запускает событие touchesEnded.

Теперь, как я могу обнаружить касание UITableView и отличить его от события выбора строки.

Спасибо.

4b9b3361

Ответ 1

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

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

  • Установите события касания для представления. Это выполнит задачу, когда вы касаетесь любого места в представлении, кроме представления таблицы.

  • TableView didSelectRowAtIndexPath выполняет следующие действия

     - (void)tableView:(UITableView*)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath {
        if(indexPath.row != previousSelectedRow && previousSelectedRow != -1) {
            // hide options or whatever you want to do
            previousSelectedRow = -1;
        }
        else {
            // show your options or other things
            previousSelectedRow = indexPath.row;
        }
     }
    

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

Примечание. В коде, написанном здесь, могут быть ошибки заклинания, потому что они непосредственно введены здесь.:)

Ответ 2

Нет необходимости подклассифицировать что-либо, вы можете добавить UITapGestureRecognizer в UITableView и принять жест или нет в зависимости от ваших критериев.

В вашем представленииDidLoad:

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(didTapOnTableView:)];
[self.myTableView addGestureRecognizer:tap];

Затем выполните следующие действия для этого критерия:

-(void) didTapOnTableView:(UIGestureRecognizer*) recognizer {
    CGPoint tapLocation = [recognizer locationInView:self.myTableView];
    NSIndexPath *indexPath = [self.myTableView indexPathForRowAtPoint:tapLocation];

    if (indexPath) { //we are in a tableview cell, let the gesture be handled by the view
        recognizer.cancelsTouchesInView = NO;
    } else { // anywhere else, do what is needed for your case
        [self.navigationController popViewControllerAnimated:YES];
    }
}

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

-(void)viewDidLoad {
    [super viewDidLoad];
    etc ...

    [self _prepareTable];
}
-(void)_prepareTable {
    self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
    self.tableView.allowsSelection = NO;
    etc...

    UITapGestureRecognizer *anyTouch =
        [[UITapGestureRecognizer alloc]
         initWithTarget:self action:@selector(tableTap)];
    [self.tableView addGestureRecognizer:anyTouch];
}
// Always drop the keyboard when the user taps on the table:
// This will correctly NOT affect any buttons in cell rows:
-(void)tableTap {
    [self.searchBar resignFirstResponder];
}
// You probably also want to drop the keyboard when the user is
// scrolling around looking at the table. If so:
-(void)scrollViewDidScroll:(UIScrollView *)scrollView {
    [self.searchBar resignFirstResponder];
}
// Finally you may or may not want to drop the keyboard when
// a button in one cell row is clicked. If so:
-(void)clickedSomeCellButton... {
    [self.searchBar resignFirstResponder];
    ...
}

Надеюсь, что это поможет кому-то.

Ответ 3

Вы должны переслать событие касания на контроллер вида. Подкласс для управления таблицей и последующим переопределением метода:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [super touchesBegan:touches withEvent:event];  //let the tableview handle cell selection 
    [self.nextResponder touchesBegan:touches withEvent:event]; // give the controller a chance for handling touch events 
}

тогда вы можете делать то, что хотите, в методах сенсорного управления.

Ответ 4

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

tableView.canCancelContentTouches = NO;

Без установки этого параметра на NO события касания отменятся, как только в вашем представлении таблицы наблюдается небольшое перемещение по вертикали (если вы поместите инструкции NSLog в свой код, вы увидите, что touchesCancelled вызывается, как только таблица начинает прокручивать по вертикали).

Ответ 5

Попробуйте следующие методы:

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{

}

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{

}

Используйте scrollViewDidEndDragging как альтернативу touchesEnded. Надеюсь, что это поможет.

Ответ 6

Для получения событий касания на UITableView используйте:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
  //<my stuff>

  [super touchesBegan:touches withEvent:event];
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
   //<my stuff>

   [super touchesMoved:touches withEvent:event];
}

- (void)touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event
{
  //<my stuff>

  [super touchesEnded:touches withEvent:event];
}

- (void)touchesCancelled:(NSSet*)touches withEvent:(UIEvent*)event
{
   //<my stuff>
   [super touchesCancelled:touches withEvent:event];
}

получать события касания в UITableView

Ответ 7

В классе контроллера объявите метод, который удаляет нижний вид. Что-то вроде этого:

-(IBAction)bottomViewRemove:(id)sender {

[bottomView removeFromSuperview];

}

В Interface Builder выберите свое представление и в инспекторе идентификации в разделе пользовательского класса, измените класс с UIView на UIControl. После этого перейдите к инспектору соединений и подключите событие TouchUpInside к описанному выше методу. Надеюсь, это поможет.