보통 UITableView 딜리게이트에 다음의 코드와 같이 알파벳 배열을 넣어주면 우측에 표시가 된다.
아참! 이기능을 사용하기 위해서 테이블의 스타일을 그룹으로 할 경우 작동하지 않음에 유의하시길 바랍니다.
1
2
3
4
5
6
7
|
– (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView
{
return [NSArray arrayWithObjects:@“A”, @“B”,....,@“#”, nil];
}
|
위의 이미지와 같이 우측 섹션인덱스 검색은 매우 유용한 기능이지만 기본적으로 A,B,C,D…. 와 같은 형태로 하면 영어권 국가에서 사용할때 유용하지만 비영어권 언어를 사용하는 국가에서는 효용성이 많이 떨어진다. 대부분 # 부분에 몰려서 나오기때문에 인덱스가 없는 것과 마찬가지의 형태로 리스트가 제공됩니다.
1
2
3
4
5
6
|
– (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView
{
return [[NSArray arrayWithObject:UITableViewIndexSearch] arrayByAddingObjectsFromArray:
[[UILocalizedIndexedCollation currentCollation] sectionIndexTitles]];
}
|
이렇게 하면 자동으로 인덱스가 출력됩니다.
위의 소스를 보면 배열안에 배열을 하나 밀어 넣었는데요 그것은 인덱스 상단에 보이는 검색아이콘을 삽입하기 위한 코드입니다.
검색아이콘이 필요없다면 return 값에 [[UILocalizedIndexedCollation currentCollation] sectionIndexTitles] 이렇게만 작성해주시면 됩니다.
나머지 작업은 애플 Reference를 참고해서 작업하시면 되겠습니다
Populating an Indexed List 를 검색하시어 내용을 보시면 쉽게 이해가 가실 겁니다.
대충 어떻게 돌아가는지에 대한 기본 로직에 대해서 간단히 설명하고 마치겠습니다.
섹션타이틀 인덱스 배열에 있는 단어들 하나하나에 셀 데이터를 배열로 넣어 2차배열로 구성합니다.
이를 통해서 테이블 데이터 소스를 뿌려준다고 생각하시면 됩니다.
저의 경우 처음에 딕셔너리로 작업했다가 전부다 바꾸는 경험을 하게 되었는데요!!
여기서 모델클래스를 만들어 활용하시면 아주아주 간단하게 구현하실 수 있습니다.
UILocalizedIndexedCollation 클래스는 인덱스에 따른 배열을 2차원배열로 구성(각각의 인덱스에 해당되는 모델오브젝트 배열을 추가)해주고 인덱스에 해당되는 모델의 프로퍼티만 연결하는 것으로 인덱스를 알아서 구분해주니 정말 쉽죠잉~!! 그럼 예제를 통해 보시면 이해가 더 빠르시리라 생각합니다.
TKAddressBook 이라는 모델 인스턴스들을 addressBookTemp라는 배열에 이미 담았다는 전제조건하에서 아래와 같이 하시면 됩니다. 최종적으로 _addressBooks라는 커스텀 배열 프로퍼티에 지지고 볶고 해서 분리와 정렬을 끝낸후 담아줍니다.
그럼 _addressBooks라는 배열을 이용해서 테이블을 구성하면 되겠죠?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
// 각 모델들의 인덱스 넘버를 설정하여 재구성
UILocalizedIndexedCollation *theCollation = [UILocalizedIndexedCollation currentCollation];
for (TKAddressBook *addressBook in addressBookTemp) {
NSInteger sect = [theCollation sectionForObject:addressBook
collationStringSelector:@selector(name)]; // name 프로퍼티의 스트링 데이터를 확인해 인덱스 받아오기
addressBook.sectionNumber = sect; // 모델에 테이블 데이터와 동기화를 위해 섹션넘버 설정 (섹션넘버 == 테이블 섹션 인덱스)
}
// 2차원 배열로 담기 위한 준비
NSInteger highSection = [[theCollation sectionTitles] count];
NSMutableArray *sectionArrays = [NSMutableArray arrayWithCapacity:highSection];
for (int i=0; i<=highSection; i++) {
NSMutableArray *sectionArray = [NSMutableArray arrayWithCapacity:1];
[sectionArrays addObject:sectionArray];
}
// 해당 인덱스에 모델들을 배열로 담는다
for (TKAddressBook *addressBook in addressBookTemp) {
[(NSMutableArray *)[sectionArrays objectAtIndex:addressBook.sectionNumber] addObject:addressBook];
}
// 각 인덱스에 담겨 있는 모델배열의 정렬
for (NSMutableArray *sectionArray in sectionArrays) {
NSArray *sortedSection = [theCollation sortedArrayFromArray:sectionArray collationStringSelector:@selector(name)];
[_addressBooks addObject:sortedSection];
}
|