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 и т.д.];