IBAction внутри UITableViewCell не вызывается в iOS 9
У меня есть пользовательский подкласс UITableViewCell
, который содержит несколько методов IBAction
, подключенных к nib.
В iOS 8 все работает так, как ожидалось. Если пользователь удаляет одну из кнопок, вызывается соответствующий IBAction
. Если пользователь нажимает в другом месте ячейки, вызывается UITableView didSelectRowAtIndexPath
.
В iOS 9 мои методы IBAction никогда не вызываются. UITableView
didSelectRowAtIndexPath
всегда запускается независимо от того, где пользователь вступает в ячейку (кнопка или нет).
Проект составлен под Xcode 6/Swift 1.2.
Я нашел этот пост на форуме Apple без решения. Кажется, у них такая же проблема.
https://forums.developer.apple.com/thread/16179
Ответы
Ответ 1
Я понял решение, надеюсь, этот ответ спасет кого-то еще.
Я унаследовал эту базу кода, и у нее были некоторые проблемы. UITableViewCell's
, которые не работали в iOS 9, не использовали UITableViewCell
nibs w/a ContentView
. Вместо этого кто-то создал элемент UIView
nib, а затем указал его на пользовательский подкласс UITableViewCell
. У перьев не было ContentView
, и, очевидно, iOS 9 немного более придирчив. Эта реализация отлично работала под iOS 8, и не было никаких ошибок или предупреждений о компиляторе или времени выполнения.
Решением было создание нового подкласса UITableViewCell
и позволить Xcode автоматически создать для него nib. Затем я скопировал весь пользовательский интерфейс и код из старого наконечника и вложил его в ContentView
нового nib. Затем мне пришлось исправить ограничения и переустановить подключения к пользовательскому подклассу.
Ответ 2
Просто добавьте эту строку в метод tableView
cellForRowAtIndexPath
cell.contentView.userInteractionEnabled = false;
return cell;
но это не правильное решение.
iOS 9 помещает представление содержимого в tableViewCell
, даже если вы используете пользовательскую ячейку /XIB. Представление содержимого, добавляемое после пользовательской ячейки, было поверх нее.
Для правильного решения этой проблемы просто замените пользовательский вид ячейки /xib на UITableviewCell
из библиотеки объектов [откуда вы обычно перетаскиваете UIButton
, UILabel
и т.д.];