Кнопка в UITableViewCell не отвечает в соответствии с ios 7
У меня есть одно табличное представление, и каждая ячейка содержит одну кнопку. Он отлично работает со всеми версиями iOS, но я не знаю, что происходит. Ячейка построена в одном файле xib.
Может ли кто-нибудь дать мне несколько предложений? Спасибо заранее.
Ответы
Ответ 1
Что сработало для меня, так это:
contentView.userInteractionEnabled = NO;
после загрузки моей пользовательской ячейки из nib. Похоже, что это представление содержимого создается и устанавливается как дочерний вид верхнего уровня после создания представлений, определенных в файле nib.
Ответ 2
Вызов [cell bringSubviewToFront:button]
после загрузки ячейки из nib решил это для меня.
Ответ 3
Я также боролся с этой проблемой, и я много исследовал различные ответы на stackoverflow и internet, решение отличается в зависимости от источника проблемы. В большинстве случаев вам необходимо выполнить следующие действия с элементом, который должен принять действие пользователя (нажмите/клик и т.д.):
myButton.userInteractionEnabled = YES;
В частности, для UILabel/UIImageView по умолчанию флаг userInteractionEnabled
NO
.
Если вы загружаете представление из xib, вам нужно убедиться, что из представления пользовательской ячейки, просмотра содержимого и элемента, который вы хотите активировать действие пользователя, все флажки отмечены флажком:
![enter image description here]()
В приведенном выше примере элементы DeviceViewCell, Content View и Кнопка имеют " Взаимодействие с пользователем флажок установлен.
Если пользовательская ячейка реализована как подкласс класса UITableViewCell, и пользовательский вид ячейки загружается из другого xib файла динамически, вам нужно сделать еще одну вещь, которая запутывает большинство людей, но я объясню, почему позже: < ш > В пользовательском методе инициализации ячейки вам необходимо сделать следующее:
self.contentView.userInteractionEnabled = NO
где self
- это подкласс UITableViewCell, который вы создали. Опять же, если пользовательская ячейка реализована как подкласс класса UITableViewCell, а пользовательский вид ячейки загружается из другого xib файла DYNAMICALLY, вам нужно сделать это выше. Вот объяснение:
self.contentView
НЕ ТОЛЬКО Content View
, который вы видите в Interface Builder, он создается системой как default content view
, которая находится в TOP всех других представлений/элементов в вашем пользовательском представлении ячеек, и это скрывает остальная часть представлений в иерархии представлений. Следовательно, вам нужно будет отключить взаимодействие пользователя, прежде чем элементы пользовательского интерфейса в пользовательском представлении ячеек могут принимать события взаимодействия с пользователем. Надеюсь это поможет. Если у вас есть лучшее объяснение, я бы с удовольствием это услышал:-). Опять же, это мое наблюдение, и могут быть другие причины. Обсуждение приветствуется!
Ответ 4
Проблема заключается в том, что ваш nib не содержит контент-просмотр, как требуется, поскольку iOS 8 SDK (я пишу по опыту, не имею жизнеспособного источника, извините).
При добавлении UITableViewController
в раскадровку автоматически добавляется UITableViewCell UITableView
. Если вы посмотрите на это UITableView
, вы увидите в нем contentView
.
Итак, когда вы подклассифицируете UITableViewCell
и создаете его с помощью .xib, вам нужно щелкнуть и перетащить UITableViewCell
в xib вместо стандартного UIView
. Затем не забудьте установить класс File Owner и класс UITableViewCell
в ваш подкласс.
Ответ 5
У меня возникла одна и та же проблема. Оказывается, я создал объект UIView в IB, а затем назначил его классу подклассу UITableViewCell.
Поскольку объект, который я изначально создавал в IB, был UIView, контент-контент UITableViewCell не добавлялся до времени выполнения, что оказалось поверх моих UIButtons, что делало их недоступными.
Ответ 6
![My Cell's outline]()
В моем случае все, что я хотел бы, чтобы пользователь мог взаимодействовать, находится вне ContentView. Также я не хочу, чтобы ячейка была подсвечена, когда она выбрана.
Все ярлыки (имя, категории и т.д.) сразу же отображаются в разделе "Просмотр содержимого". Веб-сайт WebsiteButton не находится под "Просмотр содержимого", но находится в "Ячейке таблицы локального каталога".
В моем методе tableViewController tableView: cellForRowAtIndexPath: У меня есть следующий код:
cell.contentView.userInteractionEnabled = NO;
Это все, и пользователь может взаимодействовать с кнопкой.
Я НЕ использую [cell bringSubviewToFront: cell.websiteButton];
Ответ 7
Очевидно, что есть несколько вещей, которые могут пойти не так, и некоторые исправления работают на некоторых версиях iOS, а не на других.
Моя проблема заключалась в том, что у меня был UIButton, который не был непосредственным подпунктом cell.contentView(т.е. был подчиненным подвью). Я должен был добавить свою кнопку непосредственно в cell.contentView, чтобы она была поддающейся отображению. (iOS v8 +)
Ответ 8
Решение этой проблемы;
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
cell.bringSubviewToFront(cell.YOUR_UIView)
}
Это работает для меня.
Ответ 9
Как указывали другие, всегда добавляйте subviews в представление содержимого ячейки. Если вы переопределили метод layoutSubviews
, обязательно вызовите супер-реализацию. Забытие вызова супер-реализации дает неожиданные результаты.
Ответ 10
У меня была такая же проблема с UIButton в ячейке прототипа в моей раскадровке. Я решил это, установив флажок "User Interaction Enabled" в ячейке прототипа. Это работало на iOS 7.1.
Ответ 11
У меня такая же проблема. Причина в том, что
self.contentView.Frame.size.height
всегда 44.
Есть предложение, что вы можете установить self.contentView.Frame
в self.frame
по методу перезаписи - (void)layoutSubviews
проблема будет решена
Ответ 12
Самая очевидная ошибка, которую я не видел здесь, заключается в том, что у вас ДОЛЖЕН иметь selectedBackgroundImage для того, чтобы UIButton выглядел по-другому, когда был выбран. Это не похоже, например, на UITableViewCells.
myButton.setBackgroundImage(UIImage(named: "ButtonBackgroundSelected.png"), forState: .Highlighted)
Ответ 13
В моем случае мне нужно проверить "User Interaction Enabled" для самой ячейки (а не только для contentView). Но, как отмечено в других ответах, может быть несколько причин, почему это происходит, поэтому я уверен, что это не сработает для каждого случая.
![enter image description here]()
Ответ 14
Я столкнулся с аналогичной проблемой как с UITableViewCell, так и с UICollectionViewCell. Несколько шагов:
- Всегда добавляйте subviews в представление содержимого представления ячейки, а НЕ - представление ячейки.
- Если вы добавляете представление контейнера (которое содержит вашу кнопку), отключите автоматическую компоновку представления контейнера и включите автоматический макет только для содержимого внутри представления контейнера. Используйте макет рамки для представления контейнера.
Короче говоря,
Ячейки TableView/CollectionView не могут принимать подчиненные подпрограммы (UIButton, UISegmentedControl), которые включены в автоматическую компоновку. Если у вас есть необходимость в нем, отключите автомакеты и предоставите фреймы (или) поместите их в представление контейнера (в представлении контейнера должен быть отключен автоматический макет) и добавьте разрешенные виды (с автоматической компоновкой) в виде подзонов в виде контейнера.
Ответ 15
Когда вы используете построитель интерфейсов (Storyboard), установите флажок User Interaction Enabled
с Content View
Ответ 16
Ни один из этих ответов не работал у меня.
Единственный способ, которым я смог исправить эту проблему, заключался в том, чтобы установить выбор ячейки таблицы из одного в один. После этого мне удалось получить обратные номера кнопок.
Ответ 17
Хорошо, я нашел решение этой проблемы, но, похоже, это огромный взлом; тем не менее, это все, что я смог придумать (больше ничего здесь не работало для меня).
Overtop моего button
Я добавил UITextField, который делегирует в рассматриваемую ячейку таблицы. Этот экземпляр tableViewCell реализует -(BOOL) textFieldShouldBeginEditing:(UITextField *)textField
и возвращает NO
.
Ответ 18
Проводной достаточно, на самом деле решение для меня - перейти в раскадровку, выбрать контент в ячейке и проверить "userInteractionEnabled"... в противном случае, даже если вы включили userInteraction на кнопке или ячейке, contentview всегда будет заблокировать действие.
Ответ 19
У меня был прозрачный вид на эту ячейку, которая реализовала некоторые внутренние функции и обрабатывала штрихи на себе.
Ответ 20
Я проверил все, но я сделал глупую ошибку. В раскадровке мой контроль над кнопками был ниже другого. поэтому прикосновение не переходило к моей кнопке.