Iphone - didSelectRowAtIndexPath: только вызывается после длительного нажатия на пользовательскую ячейку
Я создаю одно приложение на основе табличного представления. Я создал пользовательскую ячейку таблицы для таблицы, которая содержит 2 метки, 1 изображение и 1 кнопку. Метод представления данных в виде таблицы работает правильно. Я использую xib как для класса ячеек, так и для класса контроллера, и я подключаю делегат и источник данных к владельцу файла. Но проблема в том, что когда я выбираю строку таблицы, didSelectRowAtIndexPath не срабатывает. Как уже упоминалось, единственный способ стрельбы - удерживать камеру около 3-4 секунд. Кто-нибудь знает, почему это происходит?
Спасибо за любые указатели...
Вот мои методы просмотра таблицы.
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return [finalAddonsArray count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
NewCustomCell *cell = (NewCustomCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
NSArray *nib=[[NSBundle mainBundle]loadNibNamed:@"NewCustomCell" owner:self options:nil];
cell=[nib objectAtIndex:0];
}
Addons *addons1=[[Addons alloc]init];
addons1= [finalAddonsArray objectAtIndex:indexPath.row];
if (addons1.data == nil) {
cell.ivCategory.image = [UIImage imageNamed:@"blogo.jpg"];
}
else
{
cell.ivCategory.image=[UIImage imageWithData:addons1.data];
}
cell.lblTitle.text = addons1.name;
if (addons1.price == nil) {
cell.lblPrice.text = nil;
}
else{
cell.lblPrice.text = [NSString stringWithFormat:@"%@ rs",addons1.price];
}
[cell.button addTarget:self
action:@selector(editButtonPressed:)
forControlEvents:UIControlEventTouchUpInside];
cell.button.tag=indexPath.row;
index = indexPath;
cell.selectionStyle = UITableViewCellSelectionStyleGray;
return cell;
}
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSLog(@"sjcjksbcjksbcfkebscf1234567890");
}
Еще одна вещь, которую я получаю, если я использую UITableViewCell по умолчанию вместо пользовательской ячейки, то и моя проблема такая же, метод делегирования не срабатывает.
Пользовательские свойства ячейки:
![enter image description here]()
![enter image description here]()
Ответы
Ответ 1
Одна и та же проблема произошла со мной, потому что я добавил в нее признак распознавания жестов.
Если вы использовали любой распознаватель жестов, попробуйте удалить его и проверить, не вызвало ли это проблему.
EDIT: решение, прокомментированное Али:
Если вы использовали жестов tap, вы можете использовать [tap setCancelsTouchesInView:NO];
Ответ 2
Я столкнулся с аналогичной проблемой:
Для меня проблема заключалась в том, что мой UITableView
был добавлен к UIScrollView
и, более конкретно, к его contentView
.
Похоже, что внутри contentView
мне пришлось нажать 2-3 секунды, чтобы запустить метод didSelectRowAtIndexPath
.
Я переместил свой TableView на self.view
вместо contentView
, и он решил проблему!
Ответ 3
Возможно, вы вызовете метод
[tableView deselectRowAtIndexPath:indexPath animated:NO];
перед Push ViewController или другой операцией. Как
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
// 1. manual call this method to deSelect Other Cell
[tableView deselectRowAtIndexPath:indexPath animated:NO];
// 2. than do other operation
PushViewController Or Some Animation ....
}
это решает мою проблему.
Ответ 4
Дорогой я столкнулся с той же проблемой. Когда я постучал по ячейке, но didselectrowatindexpath не был вызван, как это было неожиданно вызвано, когда я отпустил кнопку после нажатия на нее в течение нескольких секунд.
Если вы столкнулись с одной и той же проблемой,
1. UITapGestureRecognizer, создающий проблему для вас или
2. вид прокрутки, в котором вы разместили представление таблицы.
Таким образом, вы должны удалить жест или представление суперпрокрутки, в котором находится ваш вид таблицы.
Ответ 5
Если у вас есть пользовательский объект жестов на вашем представлении, отметьте делегат override func gestureRecognizerShouldBegin(_ gesture: UIGestureRecognizer) -> Bool
. Сравните пользовательский жест с жестом отправителя, если его нестандартный объект жестов, передайте его супер. Таким образом, жесты/метки системы не будут заблокированы.
Ответ 6
Как и предлагали другие, [tap setCancelsTouchesInView:NO];
делает трюк. Однако я хочу прояснить одну вещь:
Если вы думаете, что не реализовали Tapgesture и вам интересно, почему вам пришлось добавить свое представление в защищенные представления, проверьте свой класс, потому что, скорее всего, вы унаследовали некоторый класс, и этот класс включает в себя распознаватель жестов касания.
В моем случае я сделал следующее:
- (NSMutableArray *)tapProtectedViews
{
NSMutableArray *views = [super tapProtectedViews];
[views addObject:self.mTableView];
return views;
}
Ответ 7
Я не уверен в этом, но Delays Content Touches
может иметь какое-то отношение к нему.