UIView, который создает подчиненный UIView, генерирует предупреждения об ограничениях иерархии - PullRequest
0 голосов
/ 04 февраля 2019

Я пытаюсь создать TGMapView внутри моего UIView.Как только TMMapView создается, я получаю эту ошибку:

2019-02-04 14:47:22.288241-0500 IOSDemoApp[8325:289276] [LayoutConstraints] The view hierarchy is not prepared for the constraint: <NSLayoutConstraint:0x6000015f0b40 _UILayoutGuide:0x7fe52fc0e750.leading == TrimbleMaps.TMMapView:0x7fe52fc0e320.leading   (inactive)>
    When added to a view, the constraint's items must be descendants of that view (or the view itself). This will crash if the constraint needs to be resolved before the view hierarchy is assembled. Break on -[UIView(UIConstraintBasedLayout) _viewHierarchyUnpreparedForConstraint:] to debug.
2019-02-04 14:47:22.288477-0500 IOSDemoApp[8325:289276] [LayoutConstraints] The view hierarchy is not prepared for the constraint: <NSLayoutConstraint:0x6000015f0c80 _UILayoutGuide:0x7fe52fc0e750.top == TrimbleMaps.TMMapView:0x7fe52fc0e320.top   (inactive)>
    When added to a view, the constraint's items must be descendants of that view (or the view itself). This will crash if the constraint needs to be resolved before the view hierarchy is assembled. Break on -[UIView(UIConstraintBasedLayout) _viewHierarchyUnpreparedForConstraint:] to debug.
2019-02-04 14:47:22.288642-0500 IOSDemoApp[8325:289276] [LayoutConstraints] The view hierarchy is not prepared for the constraint: <NSLayoutConstraint:0x6000015f0e10 _UILayoutGuide:0x7fe52ff05670.leading == TrimbleMaps.TMMapView:0x7fe52fc0e320.leading   (inactive)>
    When added to a view, the constraint's items must be descendants of that view (or the view itself). This will crash if the constraint needs to be resolved before the view hierarchy is assembled. Break on -[UIView(UIConstraintBasedLayout) _viewHierarchyUnpreparedForConstraint:] to debug.
2019-02-04 14:47:22.310967-0500 IOSDemoApp[8325:289276] [LayoutConstraints] The view hierarchy is not prepared for the constraint: <NSLayoutConstraint:0x6000015f0f00 TrimbleMaps.TMMapView:0x7fe52fc0e320.bottom == _UILayoutGuide:0x7fe52ff05670.bottom   (inactive)>
    When added to a view, the constraint's items must be descendants of that view (or the view itself). This will crash if the constraint needs to be resolved before the view hierarchy is assembled. Break on -[UIView(UIConstraintBasedLayout) _viewHierarchyUnpreparedForConstraint:] to debug.

Кажется, не имеет значения, что UIView, который я пытаюсь создать здесь, является TGMapView.Если я пытаюсь создать простой старый UIView, я получаю ту же проблему.

public class Sample: UIView {

    private var tangramMapView: TGMapView!
    public var trivialView: UIView!

    public required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)

        // both have the same warning/error
        guard let tangramMapView = TGMapView(coder: aDecoder) else { return nil }
        trivialView = UIView.init(coder: aDecoder)

        setup()
    }
}

Когда я запускаю это, и TGMapView, и UIView отправляют одинаковые предупреждения (скопировано выше).Я ожидаю, что не будет никаких предупреждений и что ограничения UIViews обрабатываются в setup().Я добавляю подпредставления и устанавливаю ограничения в setup().

Есть ли что-то особенное в добавлении UIViews к UIViews, о котором я не знаю?Я сделал это в неправильном порядке?Разве это не может быть сделано до инициализации superView?

РЕДАКТИРОВАТЬ:

Почему вы инициализируете его с помощью aDecoder Sample views?

Нетидея.Я настроил его в раскадровке, и я установил вид в приложении с одним представлением как Sample.В отладчике я вижу, что вызывается aDecoder init.Я не могу сказать вам, почему другие нет.

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

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

init?(coder) используется для создания UIView, когда ваш UIView настроен в раскадровке.UIView упакован и должен быть расшифрован.Важно отметить, что coder только для UIView, который был установлен в раскадровке.В данном случае это Sample.Поэтому нет смысла использовать coder для инициализации TGMapView или любого другого вида UIView.Вот в чем проблема.

Решение?В моем случае я использовал init(frame) для создания любого UIView, который я хотел внутри представления init?(coder).

0 голосов
/ 04 февраля 2019

Да, это нормально, чтобы добавить ваше содержимое в вашей инициализации.

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

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

И это именно то, что говорит ваша ошибка:

 The view hierarchy is not prepared for the constraint: <NSLayoutConstraint:0x6000015f0c80 _UILayoutGuide:0x7fe52fc0e750.top == TrimbleMaps.TMMapView:0x7fe52fc0e320.top   (inactive)>
    When added to a view, the constraint's items must be descendants of that view (or the view itself). This will crash if the constraint needs to be resolved before the view hierarchy is assembled. Break on -[UIView(UIConstraintBasedLayout) _viewHierarchyUnpreparedForConstraint:] to debug.

Вы пытаетесь указать TMMapView отношение верхнего ограничения к представлению, которое еще не является относительным.

Сначала AddSubviews , затем укажите ограничения.

РЕДАКТИРОВАТЬ

Почему вы инициализируете его с «пробными» представлениями aDecoder?Это следует делать только при создании подкласса

...