ios: кнопка в пользовательской ячейке таблицы не отвечает при прокрутке

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

я положил это

[cell.btn addTarget:self action:@selector(btnPressed:) forControlEvents:UIControlEventTouchUpInside];

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

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


способ 1

когда я попробовал метод addtarget в cellForRowAtIndexPath, и кодировка такая

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

            static NSString *cellIdentifier = @"CustomTableViewCell";
            CustomTableViewCell *cell = (CustomTableViewCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
            if (cell == nil) {
                NSArray *nib = [[NSBundle mainBundle] loadNibNamed:cellIdentifier owner:self options:nil];
                cell = [nib objectAtIndex:0];
            }
            [cell.btn addTarget:self action:@selector(btnPressed:) 
            return cell;
}

метод 2

я также попробовал другой метод, который не добавляет цель в cellForRowAtIndexPath

Вот мой код с делегатом

в customcell.h я добавил это

@protocol CustomCellDelegate <NSObject>
- (void)didClickOnbtn;
@end

в customcell.m я добавил это

@interface CustomTableViewCell()
@property (nonatomic, strong) NSDictionary *currentDict;
@property (nonatomic,assign) id<CustomCellDelegate>delegate;
@end

а также

- (IBAction)didClickOnbtn:(id)sender {
    if (self.delegate && [self.delegate respondsToSelector:@selector(didClickOnbtn)]) {
        [self.delegate didClickOnbtn];
    }
}

и я установил пользовательский делегат ячейки для просмотра таблицы

в контроллере tabelview у меня также есть метод didClickOnbtn и <CustomCellDelegate>

и кнопка может вызвать метод didClickOnbtn в ответе контроллера таблицы перед прокруткой таблицы.


ОБНОВЛЕНИЕ: я сделал представление заголовка раздела в таблице. И я узнаю, что когда я удаляю представление заголовка раздела, проблема решена. Хотя я не знаю, почему вид заголовка раздела отключил кнопку, теперь она работает хорошо. Надеюсь, это может помочь кому-то, кто находится в той же ситуации, что и я.

p.s. Оба метода работают.


person 63x1ug78    schedule 02.02.2015    source источник
comment
добавьте оператор журнала, чтобы проверить, получает ли кнопка действие или нет. Если да, то добавьте значение тега для каждой кнопки в методе cellForRowAtIndexPath при создании ячеек таблицы. и выполнять действия на основе значения тега   -  person Muhammad Adnan    schedule 02.02.2015
comment
спасибо за ответ, он получил действие перед прокруткой   -  person 63x1ug78    schedule 02.02.2015
comment
Показать полный код cellForRowAtIndexPath.   -  person Fawad Masud    schedule 02.02.2015
comment
delaysContentTouches, установленный в YES (в UIScrollView, т. е. в суперклассе UITableView), иногда может создавать иллюзию неработающих кнопок.   -  person Ryan Dignard    schedule 02.02.2015


Ответы (4)


У меня такая же проблема. Я использовал обходной путь, чтобы использовать Touch Down вместо Touch Up Inside. Это не идеальное решение, но обходной путь, поскольку IBAction для Touch Down вызывается, даже если прокрутка не завершена.

person SBK    schedule 08.12.2016

Как вы устанавливаете рамку кнопки? это относится к каркасу ячейки? или жесткий код, как показано ниже

        UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [button addTarget:self 
               action:@selector(aMethod:)
     forControlEvents:UIControlEventTouchUpInside];
    [button setTitle:@"MyButton" forState:UIControlStateNormal];
    button.frame = CGRectMake(80.0, 210.0, 160.0, 40.0); // example co-ordinate
    [cell addSubview :button] ;

В этом случае после прокрутки вниз координата кнопки не изменится и не будет работать, как вы сказали, лучший способ сделать это правильно -

создайте файл интерфейса для UITableViewCell , поместите туда кнопку и выполните подключение, это решит для вас проблему прокрутки. также вы можете попробовать сделать это.

button.frame = CGRectMake(cell.frame.origin.x+samplevalue ,cell.frame.origin.y+sampleValue , 160.0, 40.0);

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

person saket kumar    schedule 02.02.2015
comment
спасибо за ответ .. я попытался добавить кнопку в свой пользовательский вид ячейки и получил метод - (IBAction)btnPressed:(id)sender; но та же проблема Т_Т - person 63x1ug78; 02.02.2015

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

Переместите этот код в класс ячейки. Создайте собственный класс, если это еще не сделано, и добавьте этот код. В методе действия кнопки укажите ссылку на свой контроллер и вызовите некоторый API, который выполняет действие для ячейки (скажем, откройте другой контроллер или около того). Для этой цели вы можете сделать свой контроллер представления делегатом ячейки.

Надеюсь, это изменение может решить вашу проблему

person Naveen    schedule 02.02.2015
comment
Спасибо за ответ. я также пробовал этот метод, но проблемы все еще не могут быть решены - person 63x1ug78; 02.02.2015
comment
Опубликуйте вызовы методов источника данных в виде таблицы. Если вы не посмотрите на код, вы не узнаете, в чем проблема. - person Naveen; 02.02.2015
comment
В методе 2 вы получаете вызов didClickOnbtn в классе ячеек? - person Naveen; 02.02.2015
comment
Тогда вы говорите, что если вы сделаете это после прокрутки, то это не сработает? - person Naveen; 02.02.2015
comment
да, это работает, когда его ячейка возвращается в исходное положение (не прокручивается или не прокручивается назад в соответствующую позицию) - person 63x1ug78; 02.02.2015
comment
В методе 2, как вы добавляете метод действия к кнопке? - person Naveen; 02.02.2015
comment
я перетаскиваю кнопку на метод в xib и .h - person 63x1ug78; 02.02.2015

Я предполагаю, что вы хотите добавить кнопку во вторую ячейку tableView.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *cellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil)
{
    cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
}

if (indexPath.row == 0)
{
    cell.textLabel.text = @"Cell1";
}
else if (indexPath.row == 1)
{
   //Add button to cell and use different reuseIdentifier
   UITableViewCell *cell1 = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"btnCell"];
    UIButton *button = [[UIButton alloc]initWithFrame:CGRectMake(cell1.frame.origin.x+10, cell1.frame.origin.y, self.view.frame.size.width-20, cell1.frame.size.height-10)];
    [button setTitle:@"ButtonTitle" forState:UIControlStateNormal];
    shareButton.backgroundColor = [UIColor grayColor];
    [cell1 addSubview:button];
    [shareButton addTarget:self action:@selector(buttonTapped) forControlEvents:UIControlEventTouchUpInside];
    return cell1;
}

//Your code...

return cell;
}
person Prashant    schedule 02.02.2015