Когда я использую UITapGestureRecognizer для вкладки UITextfield только в разделе 0, но в разделе 1 некоторая строка не может вкладываться при выборе tableviewcell

В моем TableView есть 2 раздела, в разделе 0 есть только 1 строка. Я делаю UITextField в этом, я хочу редактировать в UITextfield (section0, row0)

но не хочу использовать вкладку для выбора строки (section0, row0)

Я использую UITapGestureRecognizer эту проблему можно решить

- (UITableViewCell *)tableView:(UITableView *)tableView 
         cellForRowAtIndexPath:(NSIndexPath *)indexPath {
...
    if(indexPath.section == 0) {
       UITapGestureRecognizer *tapRecognizer = 
       [[UITapGestureRecognizer alloc]initWithTarget:self 
                                              action:@selector(didTapAnywhere:)];
       [cell.contentView addGestureRecognizer:tapRecognizer];
}
...
}

Но когда я прокручиваю таблицу и щелкаю в разделе 1 в строке 3, строке 6, строке 9,… она не может использовать вкладку для вызова функции didSelectRowAtIndexPath.

Когда я закомментирую //UITapGestureRecognizer, раздел 1 в строке 3, строке 6, строке 9,… можно выбрать, но раздел 0, строка 0, тоже можно выбрать (я не хочу).

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

Спасибо

Образец проблемы с изображением:

http://i.stack.imgur.com/lmosN.jpg


person user3377250    schedule 06.03.2014    source источник
comment
Пожалуйста, уточните проблему и отредактируйте свою грамматику   -  person Himanshu Joshi    schedule 06.03.2014


Ответы (3)


Если вы хотите просто редактировать, но не хотите использовать вкладку для выбранной строки (section0, row0), вам не нужно добавлять tapRecognizer для этого. Тебе лучше сделать

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (indexPath.section == 0 && indexPath.row == 0) {
        [self.view endEditing:YES];
        return;
    }
    // an other section and row code
}

Если вы хотите не менять цвет ячейки при нажатии на ячейку

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // code init cell here
    if (indexPath.section == 0 && indexPath.row == 0) {
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
    }
    else {
        cell.selectionStyle = UITableViewCellSelectionStyleDefault;
    }
}
person larva    schedule 06.03.2014
comment
Я пытаюсь таким образом, но когда я нажимаю в ячейке таблицы section0 row 0, цвет ячейки меняется на серый, а в клавиатуре UItextfield не скрывается. - person user3377250; 06.03.2014
comment
@user3377250 user3377250 Я изменил ответ, и ячейка не изменит цвет при касании, при выборе раздела 0 строка 0 клавиатура скроется - person larva; 06.03.2014
comment
спасибо, я попробовал, это сработало, может быть, эта строка поможет ››[self.view endEditing:YES]; - person user3377250; 06.03.2014

Добавьте следующий код в первую ячейку в cellForRowAtIndexPath.

cell.userInteractionEnabled = NO;
person Chathurka    schedule 06.03.2014

Я полагаю, что вы используете dequeueReusableCellWithReuseIdentifier в методе tableView:cellForRowAtIndexPath.

Если вы используете его, то причина в том, что когда вы прокручиваете вниз до раздела 1, табличное представление автоматически проверяет пул ячеек и получает доступную ячейку с тем же идентификатором и назначает для каждой строки в разделе 1. Если ни одна ячейка не найдено, то у вас будет что-то вроде:

if (cell == nil)
{
    //Create new cell with an identifier
}

Поскольку ваша 1-я строка и раздел 0 (текстовое поле) больше не видны и будут возвращены в пул ячеек, табличное представление возьмет его и будет использовать для случайной строки в разделе 1 (для вашего случая это 3, 6, 9 , и т.д.). Вот почему вы не можете выбрать эти строки в разделе 1,

Так что настройте свой код и попробуйте, если это поможет:

@property (nonatomic, strong) UITapGestureRecognizer *tapRecognizer;
- (void) viewDidLoad{
    //Do stuffs as usual
    self.tapRecognizer = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(didTapAnywhere:)];
}

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

    ..
    if(indexPath.section == 0)
    {
        //cell don't have the tap recognizer yet
        if (cell.contentView.gestureRecognizers == nil || ![cell.contentView.gestureRecognizers containsObject:self.tapRecognizer])
        {
            if (self.tapRecognizer.view != nil)
                [self.tabRecognizer.view removeGestureRecognizer:self.tabRecognizer];
            [cell.contentView addGestureRecognizer:tapRecognizer];
        }
    }
    else if (cell.contentView.gestureRecognizers != nil && [cell.contentView.gestureRecognizers containsObject:self.tapRecognizer])
        [cell.contentView removeGestureRecognizer:self.tabRecognizer];


   ..

}

Это логика, вы можете на ее основе решить свою проблему :-D

person Daniel Le    schedule 06.03.2014