#swift #ios14
#uitableview #uicontrol #xcode12
Вопрос:
У меня есть форма поиска, которая использует tableview. После сегодняшнего обновления Xcode 12 UISwitch, UITextField, UISlider больше не работают при вложении в UITableViewCell. Есть ли измененное свойство, которое мне нужно установить, чтобы заставить это работать снова?
Чтобы быть уверенным, что это был не только мой проект, я создал новый проект и поместил в него UITextField, и он тоже не работает.
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = UITableViewCell()
let textField = UITextField(frame: CGRect(x: 5, y: 5, width: 400.0, height: 25.0))
textField.delegate = self
textField.backgroundColor = .blue
cell.addSubview(textField)
return cell
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
print("this will get called even when selecting the UITextField")
}
func textFieldDidBeginEditing(_ textField: UITextField) {
print("this is never called")
}
Комментарии:
1. Как правильно ответил @matt, вы ошибочно добавляете пользовательский вид как прямое подвидение самой ячейки, а не как подвидение внутри ячейки
contentView
. Причина, по которой это вызывает проблему с Xcode 12 и iOS 14, заключается в том, что ячейка по умолчаниюcontentView
теперь создается лениво при первомcontentView
обращении к свойству, вместо того, чтобы создаваться в init, что означает, что в конечном итоге она может быть добавлена в ячейку поверх ваших пользовательских представлений (которые не должны быть вложенными представлениямиячейка в первую очередь). Вместо этого вам просто нужно обновить свой кодcell.contentView.addSubview(...)
.
Ответ №1:
Ваш код всегда был неправильным:
cell.addSubview(textField)
Вы никогда не должны добавлять вложенный просмотр в ячейку. Добавьте вложенный просмотр в ячейку contentView
.
Комментарии:
1. Верно! Но я работал над старым проектом, в котором subview добавлялся непосредственно в ячейку tableview, а не в представление содержимого. Я был встревожен, как только я создал свой проект с помощью Xcode 12, так как приложение перестало реагировать во многих местах.
2. @Mot Я предполагаю, что, поскольку contentView был представлен в iOS 2, всегда было правильно добавлять представления в contentView вместо самой ячейки, но в прошлом это сходило с рук.
3. Такая маленькая деталь, но спасла меня от большой боли!! Слава @matt!
Ответ №2:
То же самое произошло со мной с тех пор, как я обновился до iOS 14. Это сработало для меня, когда я добавлял вложенные представления непосредственно в ячейку,
cell.contentView.isUserInteractionEnabled = true
Комментарии:
1. Отличный улов, это было проблемой для меня. Я предполагаю, что поведение по умолчанию изменилось для
contentView
взаимодействия в iOS 14!2. Но все же лучше не добавлять вложенные представления непосредственно в ячейку в первую очередь.
3. Я думаю, что это не имеет смысла. Вы хотите
cell.contentView.isUserInteractionEnabled = false
, потому что приложение для сборки Xcode 12 создает contentView сверху, оно может обрабатывать событие касания, и ваш другой вид не может получить событие касания.
Ответ №3:
Возникла аналогичная проблема, и она продолжалась… проблема с моим кодом заключалась в том, что в UITableViewCell я делал это:
didSet {
if contentView.backgroundColor == backgroundColor { return }
contentView.backgroundColor = backgroundColor
for v in otherView.subview { v.backgroundColor = backgroundColor }
}
Удаление этой строки здесь contentView.backgroundColor = backgroundColor
сделало свое дело. Ячейка теперь видна, и дубликатов нет contentView
Возможно, это кому-то поможет, поскольку я нашел только ответы относительно добавления вложенных представлений непосредственно в cell
, а не в cell.contentView
РЕДАКТИРОВАТЬ 1: Хорошо, просто хотел проинформировать вас о ситуации, проблема заключалась в том, что мои подвиды where of type UIStackView
и I использовались subview
там, где я действительно должен был использовать arrangedSubviews
Надеюсь, это кому-то поможет