Tuesday, February 19, 2013

Получение индекса ячейки таблицы по событию Touch на UITableView

http://hashcode.ru/questions/37818/objective-c-%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D0%B0-%D1%8F%D1%87%D0%B5%D0%B9%D0%BA%D0%B8-%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D1%8B-%D0%BF%D0%BE-%D1%81%D0%BE%D0%B1%D1%8B%D1%82%D0%B8%D1%8E-touch-%D0%BD%D0%B0-uitableview

1

Как выявить событие Touch на UITableView и по этому событию получить индекс ячейки из таблицы (IPhone SDK)?

Что надо, надо просто получить Touch-cобытие на UITableView и потом по этому событию получить индекс ячейки из таблицы. Сразу хочу сказать, что использование кастомных методов для кастомных ячеек не рассматриваю!

задан 29 Сен '11 11:04

Red%20Rocket's gravatar image

Red Rocket
1567 
75% принятых

изменен 29 Сен '11 13:33

Angry%20Bird's gravatar image

Angry Bird
766314

3

Ого, ну вы хлопцы устроили тут целый батл :). На самом деле ответ очень прост: он вытекает из делегейт метода, который называется -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{}. Кликаем по видимым ячейкам и получаем нужный индекс - все правильно, на входе дальнейшего выполнения задания возникла потребность добавить на каждую ячейку картинку, попадая в которую, происходит удаление. Хотел создать маленькую область по размерам картинки, в которой тач распознавался бы и происходило бы действие, но я немного ошибся - в результате нашел простое решение. На каждой ячейке создаю кнопочку, но не прикрепляю ей tag, а делаю следующее:

  [button addTarget:self action:@selector(checkButtonTapped:event:) forControlEvents:UIControlEventTouchUpInside];

Ну и собственно метод или селектор, кому как нравится:

  (void)checkButtonTapped:(id)sender event:(id)event
{

   
NSSet *touches = [event allTouches];
   
UITouch *touch = [touches anyObject];
   
CGPoint currentTouchPosition = [touch locationInView:SimpleTable];

    red
= [SimpleTable indexPathForRowAtPoint: currentTouchPosition];

   
if (red != nil)
   
{  
        rocket
= red.row;
       
NSLog(@"index = %@ = %i", red, rocket);
   
}
}

Всем спасибо!

ссылка

отвечен 29 Сен '11 12:07

Red%20Rocket's gravatar image

Red Rocket
1567

изменен 29 Сен '11 13:12

%D0%A5%D1%8D%D1%88%D0%9A%D0%BE%D0%B4's gravatar image

ХэшКод
6.3k530

2

Тебе придется создасть кастомный UITableView, в котором ты должен определить методы

Responding to Touch Events

   touchesBegan:withEvent:
touchesMoved:withEvent:
touchesEnded:withEvent:
touchesCancelled:withEvent:

Подробнее тут : UIResponder Class Reference

ссылка

отвечен 29 Сен '11 11:14

Nekto's gravatar image

Nekto
1111

Это огромный костыль, даже если и высчитывать все так, то лучше использовать UIGectureRecognizer

(29 Сен '11 11:17)1101_debian

Ну Ваше решение вообще не ответ на вопрос. Человек хочет получить Touch-событие. А просто найти выбранную ячейку сможет любой. UIGestrureRecognizer работает только на iOS >= 4.0, что вставляет еще больше костылей, чем отлавливать touch-события в кастомной таблице. Поэтому Ваш -1 довольно странен.

(29 Сен '11 11:21)Nekto

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

(29 Сен '11 11:31)1101_debian

Ладно Вы на SO не можете понять вопрос, потому что там по-английски пишут. Но тут написано все четко - Touch-cобытие. Более того, если Вы в чем-то не уверены, то тем более странно, что Вы сразу меня заминусовали, не разобравшись в сути вопроса.

(29 Сен '11 11:34)Nekto

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

(29 Сен '11 11:37)1101_debian
показано 5 из 6 показать еще 1
1

Сначала указываете вашей таблице в качестве делегата ваш класс-контроллер, можно через InterfaceBuilder, а можно из кода

  tableView.delegate = self;

и в вашем классе-контроллере реализуете метод

  - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
     
NSLog(@"%d", indexPath.row);   // вот в вашем indexPath будет информация об индексе ячейки и об индексе секции
   
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];   //  непосредственно ваша ячейка

}

Вариант второй, если нужно именно через тач событие

Создаете в контроллере UITapGestureRecognizer и задаете ему метод который будет вызван при тапе, этот метод должен быть определен в классе который вы передаете в качестве target, в нашем случае это self

  UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tableTapped:)];
tapRecognizer
.numberOfTouchesRequired = 1;
[self.tableView addGestureRecognizer:tapRecognizer];
[tapRecognizer release];

А в обработчике тапа уже вычисляете нужную ячейку

  - (void)tableTapped:(id)sender{
   
UITapGestureRecognizer *rec = (UITapGestureRecognizer *)sender;
   
CGPoint tapPoint =  [rec locationInView:self.tableView];
   
NSIndexPath *path = [self.tableView indexPathForRowAtPoint:tapPoint];
   
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:path];
}
ссылка

отвечен 29 Сен '11 11:16

1101_debian's gravatar image

1101_debian
3.8k416

изменен 29 Сен '11 11:34


No comments:

Post a Comment