сбой удаления вида из супервизора

#ios #swift #iphone #mobile

#iOS #swift #iPhone #Мобильный

Вопрос:

Я создал пользовательское представление, внутри которого есть кнопка, которая удаляет представление из супервизора. Представление создается с помощью контроллера представления, который является супервизором. Я настроил ограничения для своего представления в моем пользовательском классе view следующим образом, но я полагаю, что они проблематичны.

 // View Contstaints
    translatesAutoresizingMaskIntoConstraints = false
    leadingAnchor.constraint(equalTo: superview!.leadingAnchor, constant: 40).isActive = true
    trailingAnchor.constraint(equalTo: superview!.trailingAnchor, constant: -40).isActive = true
    heightAnchor.constraint(equalToConstant: 420).isActive = true
    centerYAnchor.constraint(equalTo: superview!.centerYAnchor).isActive = true
    backgroundColor = .white
    layer.cornerRadius = 15
  

Когда я нажимаю кнопку, я получаю поток 1: неустранимая ошибка: неожиданно обнаружено nil при развертывании необязательного значения
из-за этого конкретного ограничения представления

 leadingAnchor.constraint(equalTo: superview!.leadingAnchor, constant: 40).isActive = true
  

Как мне обойти это? Спасибо.

Комментарии:

1. Пользовательское представление не добавляло себя в свой супервизор, и поэтому ему не следует поручать удаление самого себя из своего супервизора. Что я, вероятно, сделал бы, так это создал протокол, содержащий функцию, подобную removeCustomViewFromSuperview() , которой соответствует контроллер представления (который содержит это пользовательское представление). При нажатии на кнопку в пользовательском представлении делегат пользовательского представления (который является контроллером представления) вызывает этот метод, и контроллер представления удаляет это пользовательское представление из супервизора.

Ответ №1:

Перед удалением представления из его супервизора может помочь вызвать NSLayoutConstraint.deactivate(yourView.constraints)

Однако было бы полезно знать, где вы вызываете свой код ограничения внутри класса view. В общем, лучше всего настроить свои ограничения в ViewController, а затем при желании удалить представление также из контроллера представления, что может решить проблему.

Комментарии:

1. Я попробовал, это все еще не работает, проблема возникает из-за того, что разворачиваю мой супервизор, объявляя, что мои ограничения связаны с супервизором, и когда я удаляю свой вложенный просмотр, я получаю сообщение об ошибке выше.

2. Пока вы активируете ограничения в ViewController после вызова, view.addSubview(yourView) тогда superView значение не должно быть равно нулю

3. Вы активируете ограничения в своем пользовательском подклассе view или в ViewController? Из вашего кода похоже, что он находится в подклассе

4. да, они находятся в моем пользовательском классе view, встроенном в функцию, и я вызываю эту функцию, переопределяя didMoveToSuperview и вызывая ее внутри него

5. Хорошо, я думаю, я знаю, что происходит. didMoveToSuperview вызывается при добавлении вашего подвида в супервизор, но также и при его удалении. При удалении вызывается код, а супервизор равен нулю. Вы могли бы просто использовать guard let superView = superView else { return } в верхней части функции, но лучше активировать эти ограничения в ViewController сразу после добавления его в качестве подвида, а не в самом представлении

Ответ №2:

Я нашел способ обойти это, но не уверен, эффективен ли он. что я сделал, так это переопределил функцию removefromsuperview и удалил все ограничения и вложенные представления там

  override func removeFromSuperview() {
    for view in self.subviews{
        view.removeFromSuperview()
    }
    NSLayoutConstraint.deactivate(self.constraints)

    removeAllConstraintsFromView(view: self)
}
  

Хотя я не уверен, освобождаю ли я таким образом свой пользовательский вид из памяти