[iOS Study] UITableView 와 UITableViewController |
출처 : 아론 힐리가스의 iOS 프로그래밍
-
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
-
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 을 누르면 코드 스니핏이 완성된다.
'프로그래밍 놀이터 > iOS' 카테고리의 다른 글
[iOS Study] UINavigationController (0) | 2016.02.22 |
---|---|
[iOS Study] UITableView 편집 (0) | 2016.02.21 |
[iOS Study] 델리게이션과 텍스트 입력 (0) | 2016.02.19 |
[iOS Study] 뷰 컨트롤러 (0) | 2016.02.18 |
[iOS Study] 뷰 다시 그리기와 UIScrollView (0) | 2016.02.17 |
댓글