* iOS 개인 프로젝트 시작 전 기본 개념 복귀 차원으로 내용을 정리합니다.
Using a Constants File and Understanding the static Keyword
- String으로 만들면 오타를 만들기 쉽다.
- String으로 계속 타이핑하기보다 constant파일로 만들어서 코드로 타입하게 한다.
- swift 파일 만든다.
- struct Constants { }
- 아래처럼 stuct 내부에 static keyword를 만든다.
- static은 let을 constant데이터 타입으로 만들어줌 => Constants 객체를 만들어주는게 아니라 가져오는 것임
- static let을 사용하면 struct 객체를 만들 필요가없이 바로 사용할 수 있다. 아래의 예시를 보자.
- static let을 선언해서 MyStructure()로 객체화해서, 그 내부 프로퍼티를 사용할 필요 없이, 바로 그 스트럭쳐명.프로퍼티 형태로 사용하게 한다.
- function도 만찬가지로 static func로 선언하면 인스턴스 메소드로 사용할 필요가없다. 즉 인스턴스로 객체화해서 메소드를 사용할 필요가없이 이니셜라이즈 필요없이, 바로 그 스트럭쳐에서 꺼내와서 사용할 수 있다.
- 아래 처럼 static으로 따로 파일에 선언해서 사용가능
- K.cellIdenrifier // 이런식으로 사용할 수 있음
TableView
- 뷰컨을 놓고 -> 파트만 테이블 뷰로 커버되길 바라면 라이브러리에서 선택해서 내가 원하는 영역만큼만 지정하기
- TableViewCell 추가
- 셀은 프토토타입으로 반복되는 반식임
- 인스펙터에서 상세한 부분 조정 가능함 => 하지만 커스텀으로 보통 하는 편
- 테이블뷰컨트롤러는 테이블 뷰만 보여줌 => 그래서 노멀 뷰컨에서 테이블뷰를 얹히는것을 더 선호함 => 테이블 뷰컨은 너무 리미티드되어있기에!
Message 모델을 만들어보자
- 메세지 모델
- ChatViewController에서 Message 모델을 가진 Array를 만든다.
- var message: [Message] = []
- 직접 만든 Message 데이터 타입으로 배열을 만들고 객체 데이터를 넣음.
UITableViewDataSource
- 테이블뷰는 델리게이션으로 데이터를 만들어낼 수 있다. It works with delegation
- extension을 만들 수 있다.
- 테이블뷰가 로드업하면 request for data, 테이블뷰의 데이터소스 = self로 만들고,
- @IBOutlet weak var tableView: UITableView! 선언하고
- viewDidLoad에 tableView.dataSource = self 하면 ChatViewController를 보면서
- => 얘를 통해 triggers the delegate method 하고, (UItableView 관련된 사용자 이벤트 함수들?) 필요한 데이터를 얻는다.
- ChatViewController class 밖에 extension을 만든다.
- 그래서 it can adapt the UITableView Data Source Protocol !
- => tableView가 loads up하면 request for data, 데이터를 요청한다. (위에서 viewDidLoad에 UITableView 프로퍼티에 delegate을 해주어야한다.)
- 그럼 아래 extension으로 만들어준 ChatViewController: UITableViewDataSource에 자동으로 UITableView관련된 함수들이 생성된다.
- UITableView, numberOfRowsInSection: 얼마나 많은 cells를 원하는지? 리턴값은 Int이다. messages.count 메세지 배열의 수를 계산해서 넘기자.
- UITableView, cellForRowAt: indexPath는 포지션이다. 여기에 셀을 만들어서 tableView에 리턴해줘야한다.
- 셀을 만들어서 테이블뷰에 리턴 해줘야 하기 때문에 먼저 셀을 선언하자
- let cell = tableView.deque~~resuse identifier
- => tableView.dequeueResusableCell 은 특정 resuse identifier 를 통해 resuable cell 오브젝트를 리턴한다.
- => 그리고 테이블에 더해준다.
- => 여기의 Reusable 셀은 무엇인가? 스토리보드에서 ResuableCell 누르고 identifier를 보면 있다.
- 그리고 indexPath는 테이블뷰가 데이터를 요청하는 현재 것이다
- 즉 nuberOfRowsInSection이 만약 return 값이 3이면, cellForRowAt, IndexPath 메소드도 3번 불린다는 것이다!
- Asking for a cell for a particular row
- dequeueResuableCell의 for:에 indexPath에 이 delegate method로부터 온 indexPath를 넣어주면 된다.
- cell에 데이터 주기 cell.textLabel?.text = "This is a cell"
- return cell 한다
- "indexPath.row" => textLabel.text가 스트링이기 때문
- indexPath.row로 cell row의 순서를 알 수 있다. 아래처럼 활용이 가능하다. 실제 배열에 있는 데이터를 이 순서를 통해 알아서 꺼내는 것이다.
- 스토리보드에서 Table View 선택하고 우측 인스펙터에서 style 카테고리에서 Seperator도 만들 수 있다. 그럼 row별로 선이 그어져있다.
- UITableViewDataSource는 responsible for populating the tableView하는 프로토콜이다.
- UITableViewDataSource는 프로토콜이지만 tableView 생성을 담당하는 프로토콜!
- 몇 개의 셀이 필요한지? 어떤 셀을 테이블뷰에 넣을지를 담당함
UITableViewDelegate
- UITableViewDelegate 프로토콜 또한 UITableViewDataSource 처럼 extension으로 ChatViewController에서 프로토콜 adpop해서 사용할 수 있다.
- viewDidLoad 메소드에서 아래와 같이 설정해야한다. IBOutlet으로 선언한 UITableView 프로퍼티에 deleagate self 해줘야 사용이 가능하다.
- 이제 tableView 가 interact by user 할때마다, 사용자가 테이블뷰의 이벤트를 발생시킬 때마다, 특정 메소드가 트리거 된다.
- 예를 들면) 사용자가 테이블뷰의 셀을 선택할 때마다 아래 메소드가 트리거 된다는 것임
- 어떤 cell이 interact됐는지 확인 가능
- 그런데 채팅앱이라면 셀, 즉 사용자의 메시지가 되겠지. 그것을 선택하는 것을 원하지 않을 수 있음!
- 그럴 경우에 스토리보드에서 ResuableCell 누르고 우측 인스펙터에서 selection 을 NONE으로 설정하여 사용자와 인터렉션하는 것을 막을 수 있음
'[iOS] App Development' 카테고리의 다른 글
[iOS] 기본 개념 정리 #9 : FireStore 적용 / 데이터 추가 (0) | 2021.11.13 |
---|---|
[iOS] 기본 개념 정리 #8 : UITableVieCell, Cell.xib (0) | 2021.11.08 |
[iOS] 기본 개념 정리 #6 : Firebase/Auth 회원가입, 로그인, 로그아웃, 네비게이션바에서 back 버튼 없애기 (0) | 2021.11.05 |
[iOS] 기본 개념 정리 #5 : 네비게이션 스타일 Segue, 패키지매니저 CocoaPods, Podfile (0) | 2021.11.05 |
[iOS] 기본 개념 정리 #4 : DarkMode, UITextFieldDelegate, Protocol, Delegate Design Pattern (0) | 2021.11.02 |