Как мне преобразовать toItem или элемент ограничений из ViewA в ViewB? Я получаю эту ошибку: неизвестный атрибут макета

#swift

#swift

Вопрос:

В качестве заголовка у меня есть viewParent, у которого есть ViewA, но ViewA будет заменен ViewB в методе awakeAfter .

Я хочу преобразовать все ограничения

из viewParent <-> ViewA,

в viewParent <-> ViewB.

Большое спасибо.

Вот мой код:

 private func convertConstraints(from: UIView, to: UIView){
        from.constraints.forEach { (constraint: NSLayoutConstraint) in
            let isFirst = (constraint.firstItem as? UIView) == from
            let isSecond = (constraint.secondItem as? UIView) == from

            let first: Any = (isFirst) ? to : constraint.firstItem as Any
            let second: Any? = (isSecond) ? to : constraint.secondItem as? Any

            let new = NSLayoutConstraint(item: first,
                               attribute: constraint.firstAttribute,
                               relatedBy: constraint.relation,
                               toItem: second,
                               attribute: constraint.secondAttribute,
                               multiplier: constraint.multiplier,
                               constant: constraint.constant)
            new.priority = constraint.priority
            new.identifier = constraint.identifier
            new.shouldBeArchived = constraint.shouldBeArchived
            new.isActive = constraint.isActive
        }
    }
  

И журнал консоли ниже:

 2019-03-27 15:36:33.740004 0800 Cale[86571:50392102] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'NSLayoutConstraint for <Cale.AirportButton: 0x7f9eb454d990; baseClass = UIButton; frame = (0 129; 120 120); autoresize = RM BM; layer = <CALayer: 0x600003936460>>: Unknown layout attribute'
*** First throw call stack:
(
    0   CoreFoundation                      0x000000010bf501bb __exceptionPreprocess   331
    1   libobjc.A.dylib                     0x000000010b4ee735 objc_exception_throw   48
    2   CoreFoundation                      0x000000010bf50015  [NSException raise:format:]   197
    3   Foundation                          0x000000010a16cf61 ResolveConstraintArguments   372
    4   Foundation                          0x000000010a16d2cb  [NSLayoutConstraint constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:]   80
.
.
.
  

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

1. Почему бы вам просто не удалить ограничения и не добавить их во второй вид? обязательно добавьте ограничения к нужному представлению после добавления представления

2. Вместо замены представления. Создайте контейнер remove и добавьте из него требуемые представления.

3. Потому что оба ViewA, который инициализируется из кода, и ViewB, загруженный из Nib, являются одним и тем же классом. И да, я могу удалить ограничения, но мне также нужно добавить их ко второму представлению, как это делает метод.

4. Я основываюсь на следующей ссылке и пытаюсь ее реорганизовать. Создание пользовательских компонентов пользовательского интерфейса в iOS с помощью Swift

Ответ №1:

Я исправил это, … большое спасибо.

Я изменил код из:

 let second: Any? = (isSecond) ? to : constraint.secondItem as? Any
  

Для:

 let second: Any? = (isSecond) ? to : constraint.secondItem
  

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

1. введите необязательный <Любой?> v.s. Любой?