본문 바로가기
개발

Mutating a priority from required to not on an installed constraint (or vice-versa) is not supported. You passed priority 999 and the existing priority was 1000.

by 꼬마상어 2019. 9. 26.
반응형

저는 주로 개발할 때 코드로 UI를 작성하는걸 즐겨하는데요.

갑자기 아래와 같이 에러를 뿜으며 앱이 죽었다.

Mutating a priority from required to not on an installed constraint (or vice-versa) is not supported. You passed priority 999 and the existing priority was 1000.)

 

대충 해석해보니 내가 레이아웃의 우선순위를 기본 1000에서 낮춰 999로 변경해두었는데, 이게 동적으로 바뀔수 없다는 뜻인듯!?

엥? 나는 레이아웃을 만드는 시점에 우선순위를 변경했는데?

알고보니 내가 레이아웃관련 코드를 쉽게 사용하려고 익스텐션을 만들어서 사용하고 있었는데,

그때 귀찮아서 그냥 만듬과 동시에 뷰에 붙이도록 만든 코드가 있었다.

요런식으루 ~

@discardableResult
	@objc func addHeightConstraint(constant c: CGFloat, identifier: String? = nil) -> NSLayoutConstraint {
		let lc = NSLayoutConstraint(item: self,
									attribute: .height,
									relatedBy: .equal,
									toItem: nil,
									attribute: .notAnAttribute,
									multiplier: 1,
									constant: c)
		lc.identifier = identifier
		addConstraint(lc)
		return lc
	}
	

근데 저걸 사용하고 그 이후에 

lc.priority = UILayoutPriority(999)

를 사용하니 이미 뷰에 제약조건이 1000으로 붙어버린 상태에서 999로 변경한다고 에러를 뿜은것!

이를 방지하기 위하여 아래와 같은 식으로 작성해야한다.

뷰에 제약조건을 붙이기 전에 우선순위를 매기기!

let lc = NSLayoutConstraint(item: tableView, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1, constant: h)

lc.priority = UILayoutPriority(999)

addConstraint(constraint)
반응형

댓글