[TIL] 2022-04-28

선주·2022년 4월 28일
0

TIL

목록 보기
11/13

📌 Selector

셀렉터는 메서드를 식별할 수 있는 고유한 이름이다.
Swift에서는 컴파일 타임에 지정된다.

Objective-C 런타임으로 실행되는 메서드가 셀렉터를 파라미터로 전달받을 때 셀렉터를 사용한다

는데.. 어렵다. 그냥 메소드 정의부 보고 파라미터에 셀렉터가 있으면 셀렉터로 만들어주지 뭐~!

let refreshControl: UIRefreshControl = UIRefreshControl()
refreshControl.addTarget(self, action: #selector(self.requestFriends), for: .valueChanged)

이런 식으로 컨트롤에 addTarget(target:action:for) 메서드를 세팅할 때, 두 번째 전달인자인 action은 Selector 타입이므로 셀렉터 인스턴스를 넘겨줘야 한다.

셀렉터 인스턴스 생성

  1. #selector() 메서드
    셀렉터는 let selector = #selector(someFunction)와 같이 #selector() 메서드를 사용하여 인스턴스를 생성할 수 있다.

  2. Function Notation 방식
    #selector() 메서드는 파라미터로 들어가는 메서드를 Function Notation 방식으로 전달해야 한다. hitTest(_:with:)와 같이 Argument Label을 콜론(:)으로 구분하여 나열하는 게 Function Notation 방식이다.

  3. @objc
    또한, 셀렉터 인스턴스를 생성할 메서드는 정의부에 @objc를 붙여주어야 한다. #selector()에 순수 Swift 함수를 전달하면 인식하지 못하기 때문! @objc를 붙여주면 Swift에서 정의한 메소드를 Objective-C에서도 인식할 수 있다.

     @objc private func requestFriends() {
          // Do something
      }

📌 UIRefreshControl

요렇게 스와이프하면 로딩중 뷰가 뜨도록 UIRefreshControl을 사용해보자. 로딩중 뷰 자체를 refresh control이라고 한다.

let refreshControl: UIRefreshControl = UIRefreshControl()
refreshControl.addTarget(self, action: #selector(self.requestFriends), for: .valueChanged)
refreshControl.tintColor = UIColor.blue

self.tableView.refreshControl = refreshControl

line 1  UIRefreshControl 인스턴스를 만든다.
line 2  addTarget을 설정해두면 for에 지정된 이벤트가 일어났을 때 action에 지정된 메소드가 호출된다.
line 3  tintColor 속성으로 색조를 넣어주었다. attributedTitle이라는 속성도 있는데 이걸로는 refresh control에 텍스트를 추가할 수 있다.
line 4  테이블뷰에 우리의 refresh control을 세팅했다.

이렇게 하면 refresh control을 띄울 수 있는데, 없앨 수도 있어야 한다. 새로고침이 끝났는데도 refresh control이 남아있으면 안 되니까!


Request.friends { (friends: [Person]?) in
    if let refreshControl: UIRefreshControl = self.tableView.refreshControl, refreshControl.isRefreshing == true {
        refreshControl.endRefreshing()
	}
}

그래서 친구목록 데이터를 다 받아오면 실행할 클로저에 refresh control을 제거하는 코드를 넣어주었다. Request와 friends는 따로 만든 구조체와 메소드인데 굳이 코드를 첨부하진 않겠음,, 그냥 친구목록 데이터 받아오는 메소드다!

데이터를 다 받아왔을 때, 즉 refresh control이 더이상 남아있을 필요가 없는 상황에 isRefreshing이 true일 경우 새로고침을 끝내줘야 한다. endRefreshing이 그 역할을 한다.


endRefreshing의 공식문서를 보면

If the refresh control is at least partially visible, calling this method also hides it.

새로고침이 끝날 때 이 메서드를 호출하면 refresh control을 숨겨준다고 한다. 애를 호출하고 나면 isRefreshing도 false가 된다. 확인해보자!

캡쳐에는 없지만 처음에 친구목록 데이터가 empty이면 requestFriends() 메소드를 호출하게 되어있다. 로그를 찍어보면 가장 처음에 requestFriends()를 호출했을 때는 새로고침 스크롤을 땡기지 않았으니 isRefreshing이 false인데, 스크롤을 땡겨보면 땡기기 시작했을 때 true가 뜨고 새로고침이 끝나면 false가 되는 것을 볼 수 있다.


참고
Tistory | Back to the Basics

profile
기록하는 개발자 👀

0개의 댓글

Powered by GraphCDN, the GraphQL CDN