2010-12-03 8 views
5

Music.app (또는 iPod.app)을 살펴보십시오. 루트 앨범보기에는 "모든 노래"행이 있습니다. 루트 곡보기에는 "셔플"행이 있습니다. 루트 재생 목록보기에는 '재생 목록 추가 ...'행이 있습니다. 정적 데이터는 동일한 UITableView에서 (아마도) 핵심 데이터 데이터와 혼합됩니다. 나는 애플이 어떻게 이것을 달성했는지 궁금하다.핵심 데이터 기반 UITableView의 비 핵심 데이터 데이터

나는 두 가지 접근법을 시도했지만 모두 실패했습니다. Music.app처럼, 내 견해도 tableHeaderView에 UISeachBar를 가지고 있습니다. 첫 번째 시도는 섹션 및 행 정보가 필요한 다양한 UITableView 및 NSFetchedResultsController 메서드에 제공된 indexPath를 얼마나 많은 "정적"행으로 조정했는지 추적합니다. NSFetchedResultsControllerDelegate 메소드를 구현하여 편집, 삭제를 구현할 때까지 모든 것이 훌륭하게 작동했습니다. insertRowsAtIndexPaths:withRowAnimation: 메서드 (및 유사)가 조정 된 indexPaths에서 트립됩니다. 기본 indexPath는 그대로 작동하지 않습니다.

두 번째 시도는 내 기본 UITableView의 tableHeaderView에있는 다른 UITableView를 정적 행에 사용하고 자신의 tableHeaderView에 UISeachBar를 포함하도록 중첩하는 것이 었습니다. 이 접근법은 편집 가능한 단계로까지 나아 가지 않았습니다. UISearchBar는 루트 UITableView의 sectionIndex 스크러버에 의해 겹쳐지며 짧은 목록을 스크롤 할 때 UINavigationBar 뒤에 더 이상 올라가지 않습니다.

내 특정 문제를 진단하기보다는 Apple이이를 어떻게 달성하는지에 대한 제안을 요청하고 있습니다. 그들은 데이터를 한 번 가져 와서 NSArray에 캐싱하고 정적 및 Core Data 행을 모두 포함하는 섹션과 행의 중첩 NSArray를 생성 할 수 있습니까?

+0

은 즉시 공개적를 게시로 ... 두 번째 방법은 다시 UIView의의 하우징 UISeachBar 및 정적 jQuery과로 설정 tableHeaderView 실행에있다. 이걸 내가 얼마나 멀리 가져갈 지 알게 될거야. 제안은 여전히 ​​환영합니다. –

답변

3

최근에 같은 문제가 발생했습니다. 정적 인 콘텐츠 (모든 노래)가있는 테이블의 맨 위에 행을 추가하고 싶습니다. 나는 단순히 섹션 0에 대한 내 자신의 섹션을 삽입하고 코어 데이터 섹션을 증가시킴으로써이 문제를 해결했다. 0은 1, 1은 2 등이됩니다.

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
    return [_fetchedResultsController sections] + 1; 
} 

- (NSInteger)tableView:(UITableView *)tv numberOfRowsInSection:(NSInteger)section { 
    if(section == 0) { 
     return 1; 
    } 
    id <NSFetchedResultsSectionInfo> sectionInfo = [[_fetchedResultsController sections] objectAtIndex:section-1]; 
    return [sectionInfo numberOfObjects]; 
} 

- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    // All Charts 
    if(indexPath.section == 0 && indexPath.row == 0) { 
     // Set up the custom cell 
    } 
    // Sets 
    else { 
     // Set up the core data cells 
    } 
} 

나머지는 행 등을 제거 할 때 indexPath 섹션을 조정할 때의 문제입니다.

+0

이것은 처음 시도한 것과 정확히 동일하지만 수정되지 않은 indexPath를 필요로하는 논리를 생성, 편집 및 삭제하는 데있어 몇 가지 방법이있는 것처럼 보였습니다. 조정되지 않은 indexPath는 조정 된 indexPath를 예상하는 메서드에 불투명하게 전달됩니다. 편집을 위해 인덱스 경로를 조정해야하는 모든 메소드 이름으로 답변을 업데이트 할 수 있습니까? 어쩌면 내가 하나 또는 둘을 잃어 버렸을 수도 있습니다. –

+0

내가 알아 냈다고 생각해. 내 테이블 뷰 NSFetchedResultsController 또는 다른보기에서 전달 된 prefetched NSManagedObjects 배열에서 데이터를 가져올 수 있도록 어댑터 패턴을 사용하여 인터페이스를 정상화했다. 조정되지 않은 값을 리턴해야 할 때 조정중인 이러한 어댑터 메소드 중 하나가 나타납니다. –

1

그게 내가 할 (내 자신의 캐시를 구축) 할거야. 당신의 앱 대 iPod.app의 주름은 NSFetchedResultsControllerDelegate 비트 인 것 같습니다. iPod.app이 특정 인터페이스를 제공한다고 생각하지 않습니다. 맞습니까? 따라서, 자동 작성/편집/재주문 지원이 없습니다.

당신 자신이 말했듯이, 이로 인해 indexPath munging이 작동을 멈추게됩니다.

나는 이걸 굴려 봐야 할 것 같아. 이것은 Apple의 API에서 흔히 볼 수 있습니다. 간단한 사용 사례에서 벗어나면 편리한 기능이 문제가되기 시작합니다. 버그 리포트에 버그 리포트를 써서 어떻게하면 좋을지 제안 할 수 있습니다 - 다른 사람들이 뛰어날 수있는 유스 케이스처럼 보이기 때문에 미래에 어떤 것을 생각해 낼 수 있기를 바랍니다.

또한, NSArrays에 저장하는 모든 방법을 필요로하는지 잘 모르겠지만, 그렇게한다면, 페치를 페이지 아웃하고, 세트가 실제로 커질 수 있다면 RAM에 필요한 것을 캐시하십시오.

나는 작업중인 간단한 사진 응용 프로그램을 가지고 있으며 캐시는 커서처럼 효과적으로 작동하는 것으로 뒷받침됩니다. 지금은 모든 것을 메모리에 보관하는 일을 끝내지 만, 세부 정보는 인터페이스를 통해 숨겨져있어 리팩토링을 매우 쉽게 할 수 있습니다. 인터페이스는 배열처럼 보이지만 자동으로 네트워크로 이동하여 추가 결과 세트를 가져 와서 CoreData에 캐시하고 서로 다른 페이지의 결과를 혼합합니다. 그래서, 내 UITableView 대리인 그냥 않습니다 [커서 objectAtIndex : 어쩌구] 마법의 장면 뒤에 숨겨져 있습니다. 그것은 매우 가능합니다.물론

Sujal