IOS 기본 - 3
- 테이블뷰 : 리스트를 보여주는 뷰
- 테이블뷰 컨트롤러가 수평적 구조를, 네비게이션 컨트롤러가 수직적 구조를 관리하여 사용자의 선택도를 높인다.
- 구조 : 테이블뷰 컨트롤러 - 테이블뷰 - 섹션들 - 셀 - 콘텐츠뷰
- 테이블 뷰를 구성하는 방법
- TableViewController를 추가 : Controller클래스가 필요한 델리게이트를 구현하고 있음
- 일반 ViewController에 TableView를 추가 : 델리게이트를 위한 프로토콜들을 구현하고, TableView에 직접 등록해 줘야 함. .delegate, .dataSource로 코드에서 등록하거나 인터페이스 빌더에서 할 수 있음.
- 프로토타입 셀 : 셀을 디자인 한다. Cell content(Image, Text), Accessory view로 구성
- TableViewCell을 상속하고 있다. TableView가 기본 제공하는 스타일을 사용하거나 커스텀할 수 있다.
- 커스텀 방법 : 일단 인터페이스 빌더에서 셀을 디자인 해야 한다.
- 셀에 tag를 주고 Controller에서 참조하여 사용
- TableViewCell을 상속한 클래스를 제작한 후 연결, 아웃렛 변수를 사용
- 커스텀 방법 : 일단 인터페이스 빌더에서 셀을 디자인 해야 한다.
- TableViewCell을 상속하고 있다. TableView가 기본 제공하는 스타일을 사용하거나 커스텀할 수 있다.
- TableView를 포함한 ViewController는 2가지 델리게이트를 구현해야 한다.
- UITableViewDataSource : 섹션, 셀의 갯수나 셀에 데이터를 바인딩.
- tableView(_:numberOfRowsInSection:) : 섹션 내의 row수를 반환한다.
- tableView(_:cellForRowAt) : 하나의 cell에 데이터를 입혀 반환한다.
- 따라오는 IndexPath객체에서 row와 section정보를 얻을 수 있다.
- UITableView.dequeueReusableCell(withIdentifier:for:)로 참조. 이 때 Identifier는 인터페이스 빌더의 TableViewCell객체에 지정해야 한다.
- 셀이 커스텀이라면 형변환 필요
- UITableViewDelegate : 사용자의 액션을 처리한다.
- tableView(_:didSelectRowAt:) : 특정 행을 선택했을 때 호출됨.
- UITableViewDataSource : 섹션, 셀의 갯수나 셀에 데이터를 바인딩.
- 셀 사이즈 조절하기
- 테이블뷰 일괄지정 : 테이블뷰의 automatic에 체크해제 및 rowHeight을 지정하고, 셀의 Custom체크를 해제한다.
- 셀 개별 지정 : 셀에 rowheight을 지정하고 Custom에 체크
- 테이블 뷰 내부, 셀 아래에 뷰를 넣으면 리스트의 빈자리를 해당 뷰가 채워 준다. 더보기버튼 같은걸로 활용 가능
- 테이블 뷰는 Android의 RecyclerView와 비슷하게 모든 셀을 미리 만들지 않고 화면에 표시할 수 있는 만큼만 만든 후 재활용한다.
- 네트워크 통신, API
- XML : XMLParser모듈로 파싱
- JSON : NSDictionary형태로 파싱 지원
-
공공 OPEN API : 인증을 위해 Oauth2.0을 사용하지만 예제에서는 인증하지 않음. https://data.go.kr https://data.seoul.go.kr 한국 영화 진흥 위원회 : https://kobis.or.kr//kobisopenapi
- HTTPS가 아닌 HTTP로 접속을 하려면 Info.plist에 다음 설정을 추가해 줘야 한다.
NSAppTransportSecurity NSAllowsArbitraryLoads - Data(contentOf:)의 contentOf에 URL객체를 넣음으로써 API를 호출한다.
- URL객체는 url String을 인자로 하여 생성할 수 있다.
- JSONSerialization.jsonObject(with:options:) as! NSDictionary로 Data객체를 JSON객체로 파싱한다. 이 객체는 NSDictionary로 캐스팅해서 사용할 수 있다. 이후 JSON객체의 계층에 따라 딕셔너리를 사용하면 된다.
-
이미지를 얻기 위해서는 Data(contentOf:)에 이미지의 URL을 넣어 얻은 Data객체를 UIImage(data:)메소드로 이미지화 한다.
- IOS에서의 비동기 처리 방식
- NSURLConectionDelegate : 델리게이트 객체에 다운로드에 대한 처리를 위임, 콜백 메소드를 받는다. 네트워크 통신에 국한됨
- DispatchQueue.main.async(), URLSession.shared.dataTask(with:callback:).resume()
- 범용 비동기 함수.
- Global Centeral Dispatch(GCD)를 이용함.
- 병렬처리와 스레드풀에 기반을 둔 비동기 처리 방식.
- autoreleasepool : 메모리 한도 이상의 대량의 이미지를 반복문에서 가져오면 메모리가 부족해짐
- 루프를 돌때 마다 autoreleasepool { … }로 감싸주면 메모리가 해제됨.
- Cocoapods : 비동기 네트워크 통신을 위한 오픈소스 라이브러리
- 터미널에서 sudo gem install cocoapods입력 하면 설치됨.
- 설치가 되면 프로젝트 루트 폴더로 이동해서 pod init, pod install을 차례로 입력
- 위 과정이 끝나면 프로젝트 디렉토리에 xcworkspace파일이 생성됨. 오픈
- Pods > Podfile을 열어 do ~ end사이에 다음을 넣음 pod ‘Alamofire’ pod ‘AlamofireImage’
- pod install
- 이후 업데이트 시 pod update
- Alamofire(통신요청/응답처리)와 AlamofireImage(이미지요청)를 import하여 사용할 수 있다.
- Alamofire.request(url:method:parameters:encoding:headers:).responseData(callback:)
- UIImageView.af_setImage(withURL:)
- 앱에서 웹페이지 사용하기
- 사파리앱 호출 : URL을 기기에 내장된 사파리 브라우저로 전달하여 오픈
- UIApplication.shared.open(url:options:)
- 이 방식을 사용하면 info.plist파일에 ATS설정할 필요가 없음
- UIWebView 사용
- WebView.loadRequest(URLRequest객체)
- WKWebView 사용
- 소속 프레임워크가 UIKit이 아니라 WeKit임
- WKWebView.load(URLRequest 객체), stopLoading(), isLoading, goBack(), goForward()
- 델리게이트
- WKNavigationDelegate webView(:decidePolicyFor:decisionHandler:) : 웹 페이지 접속 허용 여부 결정 webView(:didStartProvisionalNavigation:) : 접속을 시작 webView(:didCommit:) : 콘텐츠를 받기 시작 webView(:didFinish) : 콘텐츠 수신 완료 webView(_:didFail:withError:) : 콘텐츠 수신 실패
- WKUIDelegate
- SFSafariViewController 사용 : 사파리 브라우저를 거의 그대로 지원되면서도 컨트롤러로써 작동함
- SafariServices프레임워크 소속
- URL을 인자로 이용하여 load하는 대신 컨트롤러 초기화시에 인자로 넣는다.
- 사파리앱 호출 : URL을 기기에 내장된 사파리 브라우저로 전달하여 오픈