Вопрос

Я пишу приложение для iOS с табличным представлением внутри представления вкладок.В моем UITableViewController, Я реализовал -tableView:didSelectRowAtIndexPath:, но когда я выбираю строку во время выполнения, метод не вызывается.Однако табличное представление заполняется, поэтому я знаю, что вызываются другие методы TableView в моем контроллере.

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

Это было полезно?

Решение

Возможно, класс не является UITableViewDelegate для этого табличного представления, хотя UITableViewController должен устанавливать это автоматически.

Есть ли шанс, что вы переустановите делегата в другой класс?

Другие советы

На всякий случай, если кто-то совершил ту же глупую ошибку, что и я:

Убедитесь, что имя метода того, что вы ожидаете от didSelect , может быть случайно получено didDeselect . Мне потребовалось около двух часов, чтобы выяснить ...

Еще одна вещь, которая может привести к проблеме, это не выбранный тип выбора:

Вид выбора UITableView

Должно быть Single Selection для обычного выбора, если не должно быть No Selection .

Другая возможность заключается в том, что UITapGestureRecognizer может есть события, как это было здесь: https://stackoverflow.com/a / 9248827/214070

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

Все хорошие ответы, но есть еще один, который нужно посмотреть ...

(особенно при программном создании UITableView)

Убедитесь, что tableView может реагировать на выбор, установив [tableView setAllowsSelection: YES]; или удалив любую строку, которая устанавливает его в NO .

Если проблема возникнет с UITapGestureRecognizer ты можешь это исправить:

  • в Раскадровке:

enter image description here

в коде с Objective-C:

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

[tap setCancelsTouchesInView:NO];

в коде с Swift:

let tap = UITapGestureRecognizer(target: self, action:Selector("dismissKeyboard"))
view.addGestureRecognizer(tap)

tap.cancelsTouchesInView = false

Я столкнулся с двумя вещами в этой ситуации.

<Ол>
  • Возможно, вы забыли реализовать протокол UITableViewDelegate, или нет выхода делегирования между вашим классом и табличным представлением.

  • В вашей строке может быть UIView, который является первым респондентом и убирает ваши клики. Скажите UIButton или что-то подобное.

  • У меня была такая же проблема. И это было трудно найти. Но где-то в моем коде было это:

    - (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
        return nil;
    }
    

    Это должен быть return indexPath , иначе -tableView: didSelectRowAtIndexPath: не вызывается.

    Если вы добавили gestRecognizer поверх UITableView, didSelectRowAtIndexPath не будет вызван.

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

    - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
        if ([touch.view isDescendantOfView:YourTable]) {
            return NO;
        }
        return YES;
    }
    

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

    - (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath  *)indexPath{
        return NO;
    }
    

    Должен возвращаться YES для строки, чтобы сделать ее выбранной.

    ВЫ ДОЛЖНЫ выбрать эти параметры

     введите описание изображения здесь

    но если вы хотите, чтобы UITableView не выделялся при нажатии, вам следует внести изменения в свойства UITableViewCell .

    Выберите «Нет» для выбора, как показано ниже

     введите описание изображения здесь

    Я поместил UITapGestureRecognizer в мое табличное представление, чтобы отключить клавиатуру, которая препятствовала вызову didSelectRowAtIndexPath: . Надеюсь, это кому-нибудь поможет.

    Если у вас такая же проблема, как у меня: Очевидно, этот метод не будет вызываться, если ваш tableView находится в режиме редактирования. Вы должны установить для allowSelectionDuringEditing значение true.

    С помощью этого вопроса: При редактировании `UITableView` не вызывает didSelectRowAtIndexPath ??

    У меня была такая же проблема,

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

    Когда я комментирую строки, связанные с UITapGestureRecognizer , это работает. Кроме того, вы можете проверить в функции UITapGestureRecognizer selector , является ли нажатие UITableViewCell или нет.

    В моем случае didSelctRowAtIndexPath не вызывал из-за того, что я выбрал нет в свойстве Selection tableView, установив в одиночное выделение решил мою проблему

     введите описание изображения здесь

    Несмотря на то, что был принят еще один ответ, я добавлю еще одну возможную проблему и решение для людей, которые наблюдают за этой проблемой:

    Если у вас включен автоматический подсчет ссылок (ARC), вы можете обнаружить, что даже после назначения вашего контроллера в качестве делегата представления сообщения представления к контроллеру не принимаются, поскольку ARC удаляет контроллер. Очевидно, указатель делегата UITableView не считается ссылкой для ARC, поэтому, если это единственная ссылка на него, контроллер будет освобожден. Вы можете проверить, происходит ли это, реализуя метод dealloc на контроллере и устанавливая точку останова или вызов NSLog там.

    Решение состоит в том, чтобы отслеживать контроллер с сильной ссылкой где-то еще, пока вы не будете уверены, что он вам больше не понадобится.

    Не забудьте установить источник данных и делегировать в методе viewDidLoad следующим образом:

    [self.tableView setDelegate:self];
    
    [self.tableView setDataSource:self];
    

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

    У меня есть tableViewController , который является моей " базой " контроллер, а затем я создаю подклассы этого контроллера. Я писал весь свой код в подпрограмме tableView: didSelectRowAtIndexPath в " base " учебный класс. Полностью забывая, что по умолчанию эта подпрограмма также была создана (хотя и без кода, который что-либо делал) во всех моих подклассах. Поэтому, когда я запустил свое приложение, оно запустило версию кода подкласса, ничего не сделало и огорчило меня. Поэтому, разумеется, когда я удалил подпрограмму из подклассов, она использовала mt " base " Классная рутина и я в бизнесе.

    Я знаю. Не смейся Но, возможно, это спасет кого-то за час, который я потерял ...

    Даю 2 цента за это.

    У меня был Custom UITableViewCell, и была кнопка, покрывающая всю ячейку, поэтому, когда произошло касание, была выбрана кнопка, а не ячейка.

    Либо удалите кнопку, либо в моем случае я установил для кнопки «Интеграция пользователя» значение «ложь», чтобы ячейка была выбранной.

    Если вы прочитаете это, значит, проблема не решена.

    У меня есть пользовательская ячейка, в которой установлен флажок Взаимодействие с пользователем " был отключен. Итак, я просто включаю его. Удачи.

    У меня только что было это, и как это происходило со мной в прошлом, оно не работало, потому что я не обращал внимания на автозаполнение при попытке добавить метод, и я фактически заканчиваю тем, что реализовал tableView: didDeselectRowAtIndexPath : вместо tableView: didSelectRowAtIndexPath: .

    Я знаю, что старый и проблема была решена, но была похожая проблема, я думал, что проблема была с моим пользовательским UITableViewCell, но решение было совершенно другим - я перезапускаю XCode :) и затем работает нормально! почти как Windows :)

    Если ваше табличное представление находится в режиме редактирования (например, [tableView setEditing: YES animated: NO]; ), вам нужно установить tableView.allowsSelectionDuringEditing = YES;

    Убедитесь, что вы реализовали tableView: didSelectRowAtIndexPath , а не tableView: didDeSelectRowAtIndexPath

    Это было получено мной не раз! !!

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

    Ни один из этих ответов не помог мне. Примерно через час я понял что-то очень коварное:

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

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

    В моем случае я динамически вычисляю высоту TableView SuperView во время загрузки. Из-за неправильного расчета TableView был расположен вне SuperView . TableView был отрисован нормально, однако все взаимодействие было отключено (и didSelectRowAtIndexPath никогда не вызывалось). Очень трудно обнаружить, поскольку нет визуальной индикации того, что TableView не является «доступным».

    В моем случае решение состояло в том, чтобы изменить NO на YES в приведенной ниже функции.

    iOS 9 +

    - (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath
    {
        return YES;
    }
    

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

    Я посмотрел в IB и увидел, что мой делегат WAS установлен, но он был неправильно установлен на VIEW вместо владельца файла (щелкните правой кнопкой мыши на табличном представлении, чтобы увидеть, куда указывает делегат).

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

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top