기존 스크롤뷰의 컨텐츠 사이즈가 변경될때마다 작업을 해야하는게 있어서 어떻게 해줄까 고민하다 

스크롤뷰에

horizentalScrollView.addObserver(self, forKeyPath: "contentSize", options: .new, context: nil)

해주고  observeValue 를 override해줘서 받을 수 있다는 내용 그대로 따라해 준적이 있다.

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey: Any]?, context: UnsafeMutableRawPointer?) {
    if let obj = object as? UIScrollView, obj == self.horizentalScrollView && keyPath == "contentSize" {
    // 작업 내용
    }
}

 

 오브젝트에 컨텐츠 사이즈 라는 키로 .new 될때마다 옵저브 벨류에서 받아서 해줄수 있구나 라며 기뻐했건만

Lint 작업을 추가하면서 이걸 변경해야되는 일이 생겼다.

Block Based KVO Violation: Prefer the new block based KVO API with keypaths when using Swift 3.2 or later. (block_based_kvo)

라며 이건 옛날 스타일이라며 나를 갈구는 xcode의 메시지에 이걸 그냥 비활성화 해줄까 고민하다 방법을 찾았다.

나는 옵저버 추가를 viewdidload에서 해줬었는데 아래와 같이 변경해줬다.

var scrollViewContentSizeObserver: NSKeyValueObservation?

override func viewDidLoad() {
...

    scrollViewContentSizeObserver = horizentalScrollView.observe(\.contentSize, options: [.new], changeHandler: { view, change in
        // 작업 내용
    })

...
}

혹시 동작을 안할까봐 걱정을 많이 했으나 시뮬레이터 상에서는 멀쩡히 돌아가서 다행이다.

솔직히 저 contentSize 집어 넣는 부분이 아직도 잘 이해가 안간다.

누가 알려줄 사람은 없나

 

 

+ Recent posts