После обновления до xcode 12 я не могу разместить какой-либо UIControl внутри UITableViewCell

#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

Надеюсь, это кому-то поможет