Swift - невозможно передать жест пользователя из пользовательского UICollectionViewCell в UITextField внутри него

У меня есть пользовательский UICollectionViewCell (назовем его MyCustomCell), внутри которого есть пользовательский UITextField (назовем его MyCustomField), к которому пользователи могут добавлять текст. Однако кажется, что независимо от того, что я делаю, входные данные касания не попадают из MyCustomCell в его подвид MyCustomField. Раньше у меня было такое же расположение, за исключением того, что MyCustomCell — это UITableViewCell, и это почему-то работало.

Прямо сейчас мне пришлось использовать обходной путь, когда всякий раз, когда я нажимаю на ячейку, ячейка отправляет сообщение becomeFirstResponder() в текстовое поле. Однако это не позволяет пользователю нажимать кнопку "очистить текст" внутри MyCustomField и не позволяет пользователю перемещать курсор в текстовом поле:

// function inside the MyCustomCell, called by the view controller
// whenever it thinks the user tapped on a cell:
func cellTapped()
{
    // this is an instance of MyCustomField:
    input.becomeFirstResponder();
}

Есть ли способ «передать» фактический жест MyCustomField (либо из MyCustomCell, либо из контроллера представления, который управляет ими обоими)?

Обновление: так выглядит иерархия представлений для MyCustomCell (подкласс UICollectionViewCell):

просмотреть иерархию MyCustomCell с MyCustomField в ней


person Uzumaki Naruto    schedule 07.08.2017    source источник
comment
Вы настраиваете свою ячейку/текстовое поле с помощью раскадровки или это делается полностью с помощью кода?   -  person MultiColourPixel    schedule 08.08.2017
comment
Вы пытались установить для свойства isUserInteractionEnabled значение true как для UICollectionViewCell, так и для UITextField?   -  person Alexandre Lara    schedule 08.08.2017
comment
@MultiColourPixel - раскадровка - это просто заполнитель с некоторыми элементами автоматического ограничения того, как текстовое поле помещается в ячейку, насколько велика ячейка и т. д.; все остальное (настройка настроек) находится в коде в соответствующих файлах Swift.   -  person Uzumaki Naruto    schedule 08.08.2017
comment
@AlexandreLara - да, включено взаимодействие с пользователем проверяется в XIB как для MyCustomCell, так и для MyCustomField.   -  person Uzumaki Naruto    schedule 08.08.2017
comment
У вас случайно не было UIView, который покрывает текстовое поле ниже в иерархии представлений в раскадровке? Простая настройка, подобная вашей, с настраиваемым текстовым полем не должна вызывать у вас такой проблемы. Скорее всего, что-то просто мешает и блокирует передачу ваших нажатий в ваше пользовательское текстовое поле.   -  person MultiColourPixel    schedule 08.08.2017
comment
@MultiColourPixel - не должно, как я разместил выше обновленный скриншот этой иерархии представлений. Я думаю, что заново создам весь MyCustomCell, а затем отпишусь, если это исправит это. Может быть, это причуда в XCode ??   -  person Uzumaki Naruto    schedule 08.08.2017
comment
@MultiColourPixel - вы, скорее всего, правы. Пожалуйста, смотрите ответ, который я разместил ниже.   -  person Uzumaki Naruto    schedule 08.08.2017


Ответы (1)


Это может помочь другим, у кого есть аналогичная проблема: я считаю, что @MultiColourPixel прав в комментарии выше, что между MyCustomField и MyCustomCell есть скрытый «представление». Я сделал следующее:

  1. Резервное копирование файлов .xib и .swift для кода для MyCustomCell и MyCustomField.
  2. Удалите файлы .xib и .swift.
  3. В меню XCode повторно создайте файл .swift — и убедитесь, что вы отметили «создать XIB» также при создании файла/класса .swift, который является подклассом UICollectionViewCell.
  4. Скопируйте и вставьте старое содержимое xib/swift в новый xib/swift.
  5. Это должно работать без необходимости явно отправлять becomeFirstResponder() в MyCustomField.
person Uzumaki Naruto    schedule 08.08.2017