본문 바로가기
프로그래밍 놀이터/iOS

[iOS Study] UITableView 와 UITableViewController

by 돼지왕 왕돼지 2016. 2. 20.
반응형

 [iOS Study] UITableView 와 UITableViewController


출처 : 아론 힐리가스의 iOS 프로그래밍


32bit, 32비트, 64bit, 64비트, @class, accesorry, cell pool, code snippet library, Compiler, completion shortcut, contentview, convention, Data Source Class, DataSource, delegate, detailTextLabel, Done, exception, ImageView, import, init, initprivate, initWithStyle, initWithStyle:, IOS, ios study, ios tutorial, NSArray, NSIndexPath, NSInteger, NSString, nsuinteger, Objective-C, override, placeholder, pool, protocol, readonly, RegisterClass, registerClass:forCellReuseIdentifier, registerClass:forCellReuseIdentifier:, required method, reuseIdentifier, Row, Section, Singleton, Stack, static, static variable, Study, tableView:cellForRowAtIndexPath, tableView:cellForRowAtIndexPath:, tableView:numberOfRowsInSection, tableView:numberOfRowsInSection:, textLabel, tutorial, type 확인, UIImageView, UILabel, UITableView, UITableViewCell, UITableViewCellAccessoryNone, UITableViewCellStyle, UITableViewCellStyleDefault, UITableViewCellStyleSubtitle, UITableViewCellStyleValue1, UITableViewCellStyleValue2, UITableViewController, UITableViewDataSource, UITableViewDelegate, UITableViewStyleGrouped, UITableViewStylePlain, UIViewController, View, V자, [iOS Study] UITableView 와 UITableViewController, 가용 셀 풀, 공개 인터페이스, 관습, 규칙, 내용, 단축키, 데이터 소스, 델리게이트, 드래그, 디스클로저 아이콘, 라이브러리 선택기, 롱 프레스, 메모리, 불변 객체, 뷰 컨트롤러, 사본, 상위 클래스, 셀 풀, 스니핏 추가, 스니핏 편집, 스택, 아론 힐리가스, 엑세서리, 예외, 유틸리티, 자동 생성 코드, 재사용, 재정의, 재컴파일, 정적 변수, 지정 초기화 메소드, 체크마크, 컴파일 속도, 컴파일러, 코드 스니핏 라이브러리, 클래스 설계, 테이블뷰, 파란 점, 프로토콜, 플레이스 홀더, 하위뷰, 행, 행 갯수



-

UITableView 는 여러 행을 가질 수 있는 단일 열에 데이터를 보여준다.



-

UITableView 의 dataSource 는 UITableViewDataSource 프로토콜을 따르는 한 어떠한 Objective-C 객체든 될 수 있다.



-

UITableViewController 클래스의 인스턴스는 뷰 컨트롤러, 데이터 소스, 델리게이트의 세 가지 역할을 다 할 수 있다.



-

UITableViewController 는 UIViewController 의 하위 클래스이기 때문에 view 프로퍼티를 가진다.

UITableViewController 의 view 는 언제나 UITableView 의 인스턴스이고 UITableViewController 는 UITableView 의 준비와 표시를 제어한다.


UITableViewController 가 자신의 뷰를 만들 때, UITableView 의 dataSource 와 delegate 인스턴스 변수는 자동으로 UITableViewController 를 가리키도록 설정된다.



-

UITableView 는 일반적으로 UITableVIew 와 관련된 이벤트를 다른 객체에 알릴 수 있는 델리게이트가 필요하다.

델리게이트는 UITableViewDelegate 프로토콜을 따르는 한 어떤 객체들 될 수 있다.



-

UITableViewController 의 지정 초기화 메소드는 테이블뷰의 스타일을 지정하는 상수를 받는 initWithStyle: 이다.

이 스타일에는 UITableViewStylePlain 과 UITableViewStyleGrouped  두 가지 옵션이 있다.



-

초기화 메소드는 두 가지 규칙을 따라야 한다.

     상위 클래스의 지정 초기화 메소드를 호출한다.

     상위 클래스의 지정 초기화 메소드가 자신의 메소드를 호출하도록 재정의한다.



-

UITableViewController 의 view 는 항상 UITableView 인스턴스이다.



-

singleton 을 만들기 위해 static 을 이용한다.

정적 변수(static variable) 은 메소드가 완료되어도 소멸되지 않는다.

전역 변수와 마찬가지로 스택에 저장되지 않는다.


singleton 을 만들 때는 init 메소드가 예외를 던지도록 하고,

비공개 지정 초기화 메소드 initPrivate 을 만들도록 한다.



-

@class 지시자는 컴파일러에 해당 클래스가 존재한다는 것을 알리고,

실제로 파일이 존재하면 컴파일러가 이 클래스의 세부 사항을 알 필요가 없다는 것을 알린다.

이는 해당 클래스 파일의 임포트 없이 해당 클래스 심벌을 사용할 수 있게 허용한다.


@class  지시자의 사용은 파일이 변경되었을 때 보다 적은 수의 파일들만

재컴파일하기 때문에 컴파일 속도를 상당히 빠르게 할 수 있다.







-

실제로 클래스의 인스턴스에 메시지를 보내는 파일에서는 반드시 클래스가 선언된 파일을 임포트해야 한다.

그래야 컴파일러가 세부 사항을 알 수 있기 때문이다.



-

Data Source Class 에서 배열을 전적으로 제어하기 위해, 배열을 reaonly 프로퍼티로 선언하고 변경할 수 없는 NSArray 로 반환할 수 있다.

다른 객체에서 새 배열을 할당하거나 배열을 직접 수정할 수 없다.

하지만 내부에서는 새 품목을 추가(또는 삭제, 재정렬)하기 위해 배열을 변경해야 한다.

이는 내부 데이터를 엄격히 제어하기 위한 흔한 클래스 설계방식이다.

객체는 내부에 변경할 수 있는 자료구조로 유지하지만, 다른 객체들은 변경할 수 없는 자료구조에만 접근할 수 있다.



-

클래스를 사용할 때 클래스와 상호 작용법을 알려주는 인터페이스 파일에만 의존할 수 있다.

만약 인터페이스 파일이 어느 객체가 NSArray 라고 알려주면 우리는 그것을 NSArray 로 처리해야 한다. ( 관습 )

이를 다르게 사용한다면 공개 인터페이스에 명시된 내용을 어기게 되는 것이다.

정말로 조심하고자 한다면 프로퍼티의 불변 객체 사본을 반환하는 것이 좋다.



-

UITableView 는 표시할 내용을 알길 원할 때 UITableViewDataSource 프로토콜에 선언된 곳에 메시지들을 보낸다.


tableView:numberOfRowsInSection: 과 tableView:cellForRowAtIndexPath: 는 required method 이다.

이 두 메소드는 반드시 구현해야 한다.

이들 메소드는 테이블뷰에 표시할 행이 몇 개인지 각 행에 표시할 내용이 무엇인지 알린다.



-

UITableView 는 표시될 때마다 일련의 메시지들을 자신의 dataSource 에 보낸다.

필수 메소드 tableView:numberOfRowsInSection: 은 UITableView 에 표시할 행의 개수를 나타내는 정수값을 반환한다.



-

애플이 32비트와 64비트 시스템, 둘 다 지원하기 시작했을 때 32비트에서는 32비트 int,

64비트 프로그램에서는 64비트 int 의 정수 타입이 필요했다.

그래서 NSInteger 와 NSUInteger 가 생겨났다.

이 타입들은 애플의 프레임워크 전반에 걸쳐 광범위하게 사용된다.



-

테이블뷰의 각 행은 뷰이다.

이 뷰들은 UITableViewCell 인스턴스들이다.


셀 자체는 contentView 라는 하나의 하위뷰를 가진다.

contentView 는 셀의 내용을 위한 상위뷰이다.

셀은 엑세서리 지시자를 그릴 수 있다.

엑세서리 지시자는 체크마크, 디스클로저 아이콘, V자 무늬를 가진 파란 점 등 동작 가능한 아이콘을 뜻한다.

이 아이콘들은 액세서리 지시자의 형태를 지정하기 위해 미리 정의된 상수를 통해 접근한다.

기본값은 UITableViewCellAccessoryNone  이다.



-

UITableViewCell 의 실체는 contentView 의 세 하위뷰이다.

두 개는 UITableViewCell 의 프로퍼티인 textLabel 과 detailTextLabel 이라는 이름의 UILabel 인스턴스이다.

세 번째 하위뷰는 imageView 라는 이름의 UIImageView 이다.


-

셀은 contentView 안에 어떤 하위뷰들이 사용되고 어디에 위치하는지 결정하는 UITableViewCellStyle 속성을 가진다.


UITableViewCellStyleDefault

UITableViewCellStyleSubtitle

UITableViewCellStyleValue1

UITableViewCellStyleValue2


32bit, 32비트, 64bit, 64비트, @class, accesorry, cell pool, code snippet library, Compiler, completion shortcut, contentview, convention, Data Source Class, DataSource, delegate, detailTextLabel, Done, exception, ImageView, import, init, initprivate, initWithStyle, initWithStyle:, IOS, ios study, ios tutorial, NSArray, NSIndexPath, NSInteger, NSString, nsuinteger, Objective-C, override, placeholder, pool, protocol, readonly, RegisterClass, registerClass:forCellReuseIdentifier, registerClass:forCellReuseIdentifier:, required method, reuseIdentifier, Row, Section, Singleton, Stack, static, static variable, Study, tableView:cellForRowAtIndexPath, tableView:cellForRowAtIndexPath:, tableView:numberOfRowsInSection, tableView:numberOfRowsInSection:, textLabel, tutorial, type 확인, UIImageView, UILabel, UITableView, UITableViewCell, UITableViewCellAccessoryNone, UITableViewCellStyle, UITableViewCellStyleDefault, UITableViewCellStyleSubtitle, UITableViewCellStyleValue1, UITableViewCellStyleValue2, UITableViewController, UITableViewDataSource, UITableViewDelegate, UITableViewStyleGrouped, UITableViewStylePlain, UIViewController, View, V자, [iOS Study] UITableView 와 UITableViewController, 가용 셀 풀, 공개 인터페이스, 관습, 규칙, 내용, 단축키, 데이터 소스, 델리게이트, 드래그, 디스클로저 아이콘, 라이브러리 선택기, 롱 프레스, 메모리, 불변 객체, 뷰 컨트롤러, 사본, 상위 클래스, 셀 풀, 스니핏 추가, 스니핏 편집, 스택, 아론 힐리가스, 엑세서리, 예외, 유틸리티, 자동 생성 코드, 재사용, 재정의, 재컴파일, 정적 변수, 지정 초기화 메소드, 체크마크, 컴파일 속도, 컴파일러, 코드 스니핏 라이브러리, 클래스 설계, 테이블뷰, 파란 점, 프로토콜, 플레이스 홀더, 하위뷰, 행, 행 갯수



-

tableVIew:cellForRowAtIndexPath: 의 인자 중 하나인 NSIndexPath 에는 section 과 row 라는 두 프로퍼티가 있다.

테이블뷰는 이 메시지를 데이터 소스에 보낼 때 X 섹션의 Y 행에 표시할 셀을 달라고 요청한다.



-

사용자가 테이블을 스크롤하면 일부 셀들은 화면 밖으로 사라진다.

사라진 셀들은 재사용을 위해 가용 셀 풀(pool)에 들어간다.

그리고 데이터 소스는 요청이 올 때 새로운 셀을 만드는 대신에 그 풀을 먼저 확인한다.

데이터 소스는 풀에 사용되지 않은 셀이 있다면 새로운 데이터를 그 셀에 설정하고 테이블 뷰에 반환한다.







-

UITableView 는 종종 다른 타입의 셀들을 가진다.

때로는 특정한 모습이나 동작을 위해 UITableViewCell 의 하위 클래스를 만들 수도 있다.

하지만 서로 다른 하위 클래스들이 재사용 셀의 풀에서 돌아다니다가 잘못된 타입의 셀을 반환하게 될 가능성이 있다.

반드시 반환된 셀의 타입을 확인해야 한다.


모든 셀은 NSString 타입의 reuseIdentifier 프로퍼티를 가지고 있다.

데이터 소스는 테이블뷰에 재사용 셀을 요청할 때 재사용 식별 문자열을 전달하고 다음과 같이 말한다.

“이 재사용 식별자를 가진 셀이 필요해."

관례적으로 재사용 식별자는 보통 셀 클래스의 이름을 사용한다.


이렇게 동작하기 위해선 재사용 풀에 셀이 없는 경우 테이블뷰에 어떤 종류의 셀을 인스턴스화 할 것인지 알려야 한다.

알리는 작업은 보통 viewDidLoad 에서 [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"UITableViewCell"]; 을 통해 한다.


셀의 재사용은 셀의 생성을 최소화하여 메모리 사용량을 줄인다는 것을 의미한다.



-

자동 생성 코드는 코드 스니핏 라이브러리(code snippet library) 에 의해 생성된다.

코드 스니핏 라이브러리는 유틸리티 영역을 열고 라이브러리 선택기에서 탭을 누르면 볼 수 있다.

Command + Control + Option + 2 단축키로도 가능하다.


아이템 하나를 잠시 클릭하고 있으면 그 스니핏에 대한 세부 내용이 표시된다.



-

Completion Shortcut 필드는 소스 파일에서 무엇을 입력해야 Xcode 가 스니핏을 추가하는지 보여준다.



-

미리 정의된 코드 스니핏은 편집할 수 없지만 직접 스니핏을 만들 수는 있다.

코드를 선택하고, 그 코드를 스니핏 라이브러리로 드래그한다.


해당 프로그램에서만 사용 가능한 부분은, 플레이스 홀더로 만들 수 있다.

<#number of rows#> 와 같은 문법을 사용한다.


필드를 다 채우고 Done 을 누르면 코드 스니핏이 완성된다.









반응형

댓글