#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)
}
Хотя я не уверен, освобождаю ли я таким образом свой пользовательский вид из памяти