chaneeii / iOS-Study-Log

✨ iOS에 대해 공부한 것들을 기록합니다 ✨
18 stars 0 forks source link

[Error] Unable to activate constraint with anchors error #8

Open chaneeii opened 1 year ago

chaneeii commented 1 year ago

⛔️ 에러 본문

스크린샷 2022-07-15 오후 9 36 22

Thread 1: "Unable to activate constraint with anchors <NSLayoutYAxisAnchor:0x600002beeb00 \"UILabel:0x1270105c0.top\"> and <NSLayoutYAxisAnchor:0x600002beeb40 \"UIStackView:0x127010430.bottom\"> because they have no common ancestor. Does the constraint or its anchors reference items in different view hierarchies? That's illegal."

📃 에러가 발생한 상황 (코드)

override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier )
        self.backgroundColor = .white

        // contentview에 stack view 넣기
        self.contentView.addSubview(self.nicknameContainer)
        self.contentView.addSubview(self.timeLabel)  // ⛔️ 문제가 된 부분

        // autolayout 적용
        self.nicknameContainer.translatesAutoresizingMaskIntoConstraints = false
        self.titleLabel.translatesAutoresizingMaskIntoConstraints = false

        NSLayoutConstraint.activate([
            self.nicknameContainer.topAnchor.constraint(equalTo: self.contentView.topAnchor, constant: 15),
            self.nicknameContainer.leadingAnchor.constraint(equalTo: self.contentView.leadingAnchor, constant: 24),
            self.nicknameContainer.trailingAnchor.constraint(equalTo: self.contentView.trailingAnchor, constant: -24),
            self.nicknameContainer.heightAnchor.constraint(equalToConstant: 24),

            self.titleLabel.topAnchor.constraint(equalTo: self.nicknameContainer.bottomAnchor, constant: 4),
            self.titleLabel.leadingAnchor.constraint(equalTo: self.contentView.leadingAnchor, constant: 24),
            self.titleLabel.trailingAnchor.constraint(equalTo: self.contentView.trailingAnchor, constant: -24),
            self.titleLabel.bottomAnchor.constraint(equalTo: self.contentView.bottomAnchor, constant: -24)

        ])
    }

‼️ 원인 및 해결방법

원인은 나의 실수였다. titleLabel 이라고 작성해야하는 건데 timeLabel 이라고 다른 라벨과 착각하여 적었던 것. 따라서 상위 뷰와 하위 뷰를 연결시키고 접근권한을 주어야하는 addSubView가 상위뷰가 오타로 없었으니 이러한 에러 메세지를 띄운 것이다.

before

self.contentView.addSubview(self.timeLabel)  // ⛔️ 문제가 된 부분

after

self.contentView.addSubview(self.titleLabel)  // ✅ 해결

➕ 그외 사항

나의 경우 이번에러에서 단순 typo 로 인한 에러였지만, 해당 에러 메세지는 보통 다음과 같은 경우에 많이 발생한다. 상위 뷰와 하위 뷰를 연결시키고 접근권한을 주어야하는 addSubView 가 권한이 없는 상위 뷰에 접근하여 제약조건을 걸려고 하는 경우 발생한다.

결론 : view.addSubView 는 제약조건을 사용하기 전에 미리 호출 해주는 것이 중요하다! (위치가 중요)