[iOS] App Development

[iOS] 기본 개념 정리 #7 : Static Keyword / TableView / TableViewCell / UITableViewDataSource / UITableViewDelegate

ddgoori 2021. 11. 7. 14:37

* iOS 개인 프로젝트 시작 전 기본 개념 복귀 차원으로 내용을 정리합니다.

 

Using a Constants File and Understanding the static Keyword

 

  1. String으로 만들면 오타를 만들기 쉽다. 
  2. String으로 계속 타이핑하기보다 constant파일로 만들어서 코드로 타입하게 한다.
  3. swift 파일 만든다.
  4. struct Constants { }
  5. 아래처럼 stuct 내부에 static keyword를 만든다.
  6. static은 let을 constant데이터 타입으로 만들어줌  => Constants 객체를 만들어주는게 아니라 가져오는 것임
  7. static let을 사용하면 struct 객체를 만들 필요가없이 바로 사용할 수 있다. 아래의 예시를 보자.
  8. static let을 선언해서 MyStructure()로 객체화해서, 그 내부 프로퍼티를 사용할 필요 없이, 바로 그 스트럭쳐명.프로퍼티 형태로 사용하게 한다.
  9. function도 만찬가지로 static func로 선언하면 인스턴스 메소드로 사용할 필요가없다. 즉 인스턴스로 객체화해서 메소드를 사용할 필요가없이 이니셜라이즈 필요없이, 바로 그 스트럭쳐에서 꺼내와서 사용할 수 있다.
  10. 아래 처럼 static으로 따로 파일에 선언해서 사용가능
  11. K.cellIdenrifier // 이런식으로 사용할 수 있음

TableView

 

 

  1. 뷰컨을 놓고 -> 파트만 테이블 뷰로 커버되길 바라면 라이브러리에서 선택해서 내가 원하는 영역만큼만 지정하기
  2. TableViewCell 추가
  3. 셀은 프토토타입으로 반복되는 반식임
  4. 인스펙터에서 상세한 부분 조정 가능함 => 하지만 커스텀으로 보통 하는 편
  5. 테이블뷰컨트롤러는 테이블 뷰만 보여줌 => 그래서 노멀 뷰컨에서 테이블뷰를 얹히는것을 더 선호함 => 테이블 뷰컨은 너무 리미티드되어있기에!

 

 

Message 모델을 만들어보자

 

 

  1. 메세지 모델
  2. ChatViewController에서 Message 모델을 가진 Array를 만든다.
  3. var message: [Message] = []
  4. 직접 만든 Message 데이터 타입으로 배열을 만들고 객체 데이터를 넣음.

 

 

 

UITableViewDataSource

 

 

  1. 테이블뷰는 델리게이션으로 데이터를 만들어낼 수 있다. It works with delegation
  2. extension을 만들 수 있다.
  3. 테이블뷰가 로드업하면 request for data, 테이블뷰의 데이터소스 = self로 만들고,
    1. @IBOutlet weak var tableView: UITableView!  선언하고
    2. viewDidLoad에 tableView.dataSource = self  하면 ChatViewController를 보면서 
    3. => 얘를 통해 triggers the delegate method 하고, (UItableView 관련된 사용자 이벤트 함수들?) 필요한 데이터를 얻는다. 
  4.  
  5. ChatViewController class 밖에 extension을 만든다.
  6. 그래서 it can adapt the UITableView Data Source Protocol !
  7. => tableView가 loads up하면 request for data, 데이터를 요청한다. (위에서 viewDidLoad에 UITableView 프로퍼티에 delegate을 해주어야한다.)
  8. 그럼 아래 extension으로 만들어준 ChatViewController: UITableViewDataSource에 자동으로 UITableView관련된 함수들이 생성된다.
  9. UITableView, numberOfRowsInSection: 얼마나 많은 cells를 원하는지? 리턴값은 Int이다. messages.count 메세지 배열의 수를 계산해서 넘기자.
  10. UITableView, cellForRowAt: indexPath는 포지션이다. 여기에 셀을 만들어서 tableView에 리턴해줘야한다.
  11. 셀을 만들어서 테이블뷰에 리턴 해줘야 하기 때문에 먼저 셀을 선언하자
    1. let cell = tableView.deque~~resuse identifier
    2. => tableView.dequeueResusableCell 은  특정 resuse identifier 를 통해 resuable cell 오브젝트를 리턴한다.
    3. => 그리고 테이블에 더해준다. 
    4. => 여기의 Reusable 셀은 무엇인가? 스토리보드에서 ResuableCell 누르고 identifier를 보면 있다.
  12. 그리고 indexPath는 테이블뷰가 데이터를 요청하는 현재 것이다
  13. 즉 nuberOfRowsInSection이 만약 return 값이 3이면,  cellForRowAt, IndexPath 메소드도 3번 불린다는 것이다!
    1. Asking for a cell for a particular row
  14. dequeueResuableCell의 for:에 indexPath에 이 delegate method로부터 온 indexPath를 넣어주면 된다.
  15. cell에 데이터 주기 cell.textLabel?.text = "This is a cell"
  16. return cell 한다 
  17. "indexPath.row" => textLabel.text가 스트링이기 때문
  18. indexPath.row로 cell row의 순서를 알 수 있다. 아래처럼 활용이 가능하다. 실제 배열에 있는 데이터를 이 순서를 통해 알아서 꺼내는 것이다. 
  19. 스토리보드에서 Table View 선택하고 우측 인스펙터에서 style 카테고리에서 Seperator도 만들 수 있다. 그럼 row별로 선이 그어져있다.
  20. UITableViewDataSource는 responsible for populating the tableView하는 프로토콜이다.
    1. UITableViewDataSource는 프로토콜이지만 tableView 생성을 담당하는 프로토콜!
    2. 몇 개의 셀이 필요한지? 어떤 셀을 테이블뷰에 넣을지를 담당함

 

 

 

UITableViewDelegate

 

 

  1. UITableViewDelegate 프로토콜 또한 UITableViewDataSource 처럼 extension으로 ChatViewController에서 프로토콜 adpop해서 사용할 수 있다.
    1. viewDidLoad 메소드에서 아래와 같이 설정해야한다. IBOutlet으로 선언한 UITableView 프로퍼티에 deleagate self 해줘야 사용이 가능하다. 
  2. 이제 tableView 가 interact by user 할때마다, 사용자가 테이블뷰의 이벤트를 발생시킬 때마다, 특정 메소드가 트리거 된다.
    1. 예를 들면) 사용자가 테이블뷰의 셀을 선택할 때마다 아래 메소드가 트리거 된다는 것임
    2. 어떤 cell이 interact됐는지 확인 가능

  3. 그런데 채팅앱이라면 셀, 즉 사용자의 메시지가 되겠지. 그것을 선택하는 것을 원하지 않을 수 있음!
  4. 그럴 경우에 스토리보드에서 ResuableCell 누르고 우측 인스펙터에서 selection 을 NONE으로 설정하여 사용자와 인터렉션하는 것을 막을 수 있음