programing

iPhone UI 테이블 보기.음악 앱처럼 알파벳 단일 목록을 설정하는 방법은 무엇입니까?

css3 2023. 7. 29. 08:49

iPhone UI 테이블 보기.음악 앱처럼 알파벳 단일 목록을 설정하는 방법은 무엇입니까?

iPhone 음악 앱에서 아티스트, 노래 또는 앨범을 선택하면 UI 오른쪽에 단일 문자의 수직 목록이 있는 테이블 보기가 표시되어 빠른 스크롤이 가능합니다.앱에서 이 기능을 활성화하려면 어떻게 해야 합니까?

건배, 더그

고유한 인덱스 문자를 입력합니다.

- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView {
    return[NSArray arrayWithObjects:@"a", @"e", @"i", @"m", @"p", nil];
}

다음과 같은 경우:

- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString
    *)title atIndex:(NSInteger)index {
        return <yourSectionIndexForTheSectionForSectionIndexTitle >;
}

섹션이 필요합니다.

각 언어의 섹션을 현지화하는 것도 고려해야 합니다.조금 뒤에, 저는 발견했습니다.UILocalizedIndexedCollation꽤 유용하게 사용할 수 있습니다.

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    return [[[UILocalizedIndexedCollation currentCollation] sectionTitles] objectAtIndex:section];
}

- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView {
    return [[UILocalizedIndexedCollation currentCollation] sectionIndexTitles];
}

- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index {
    return [[UILocalizedIndexedCollation currentCollation] sectionForSectionIndexTitleAtIndex:index];
}

https://developer.apple.com/documentation/uikit/uilocalizedindexedcollation

저는 섹션을 사용하지 않고 단일 알파벳 목록을 처리하는 대안을 생각해냈습니다.Zap의 답변과 비슷하지만 새 인덱스를 반환하여 값을 얻는 대신 특정 문자로 시작하는 배열의 첫 번째 항목 위치에 대한 인덱스를 계산한 다음 해당 항목으로 스크롤합니다.

단점은 매번 어레이를 검색해야 한다는 것입니다(이것이 정말 끔찍합니까?). 하지만 iOS 시뮬레이터나 아이폰 4S에서 지연이나 느린 동작을 감지하지 못했습니다.

- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView {
  return[NSArray arrayWithObjects:@"A", @"B", @"C", @"D", @"E", @"F", @"G", @"H", @"I", @"J", @"K", @"L", @"M", @"N", @"O", @"P", @"Q", @"R", @"S", @"T", @"U", @"V", @"W", @"X", @"Y", @"Z", nil];
}

- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index {

  NSInteger newRow = [self indexForFirstChar:title inArray:self.yourStringArray];
  NSIndexPath *newIndexPath = [NSIndexPath indexPathForRow:newRow inSection:0];
  [tableView scrollToRowAtIndexPath:newIndexPath atScrollPosition:UITableViewScrollPositionTop animated:NO];

  return index;
}

// Return the index for the location of the first item in an array that begins with a certain character
- (NSInteger)indexForFirstChar:(NSString *)character inArray:(NSArray *)array
{
  NSUInteger count = 0;
  for (NSString *str in array) {
    if ([str hasPrefix:character]) {
      return count;
    }
    count++;
  }
  return 0;
}

속성을 추가하여 마지막으로 선택한 인덱스 저장

 @property (assign, nonatomic) NSInteger previousSearchIndex;

다음과 같이 매번 이 속성을 저장합니다.

- (NSInteger)indexForFirstChar:(NSString *)character inArray:(NSArray *)array
{
    NSUInteger count = 0;
    for (NSString *str in array) {
        if ([str hasPrefix:character]) {
            self.previousSearchIndex = count;
            return count;
        }
        count++;
    }
    return self.previousSearchIndex;
}

및 업데이트scrollToRow다음과 같은 코드:

 [tableView scrollToRowAtIndexPath:newIndexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];

멋진 애니메이션으로 이 방법을 훨씬 더 잘 수행합니다.

많은 사람들이 섹션 없이 이것을 할 수 있는지 물었습니다.저는 같은 것을 원했고 약간 수상할 수 있고 섹션에 값을 반환하지 않는 솔루션을 찾았습니다.IndexTitle(색인 제목) 하지만 구석에 있는 경우 알파벳의 모든 문자에 대해 섹션을 만들지 않으려는 경우에는 이 방법이 확실합니다.나치 코드에 미리 미안합니다. :P.

- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView {
    if (thisTableDataIsShowing)
    {
        NSMutableArray *charactersForSort = [[NSMutableArray alloc] init];
        for (NSDictionary *item in d_itemsInTable)
        {
            if (![charactersForSort containsObject:[[item valueForKey:@"character_field_to_sort_by"] substringToIndex:1]])
            {
                [charactersForSort addObject:[[item valueForKey:@"character_field_to_sort_by"] substringToIndex:1]];
            }
        }
        return charactersForSort;
    }
    return nil;
}

- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index {
    BOOL found = NO;
    NSInteger b = 0;
    for (NSDictionary *item in d_itemsInTable)
    {
        if ([[[item valueForKey:@"character_field_to_sort_by"] substringToIndex:1] isEqualToString:title])
            if (!found)
            {
                [d_yourTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:b inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO];
                found = YES;
            }
        b++;
    }
}

많은 양의 데이터를 얻고 있고 그것을 분할하는 데 많은 작업이 필요하다면 잘 작동합니다. :) 일반 변수를 사용하여 내가 무엇을 하고 있는지 알고자 했습니다. d_itemsInTable은 내가 UITableView에 나열하는 NSA 배열입니다.

다음은 문자열이 없는 인덱스를 클릭하는 경우를 처리하는 Kyle 함수의 수정된 버전입니다.

- (NSInteger)indexForFirstChar:(NSString *)character inArray:(NSArray *)array
{
    char testChar = [character characterAtIndex:0];
    __block int retIdx = 0;
    __block int lastIdx = 0;

    [array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        char firstChar = [obj characterAtIndex:0];

        if (testChar == firstChar) {
            retIdx = idx;
            *stop = YES;
        }

        //if we overshot the target, just use whatever previous one was
        if (testChar < firstChar) {
            retIdx = lastIdx;
            *stop = YES;
        }

        lastIdx = idx;
    }];
    return retIdx;
}

NSFetchedResultsController그냥 할 수 있습니다.

- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView {
    return [frc sectionIndexTitles];
}

- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index {
    return [frc sectionForSectionIndexTitle:title atIndex:index];
}

방법 -sectionIndexTitlesForTableView:그리고.-tableView:sectionForSectionIndexTitle:atIndex:

자세한 내용은 설명서를 참조하십시오.

여기 Swift의 간단한 솔루션이 있습니다. 제목 헤더가 배열에 있다고 가정합니다.제목을 찾을 수 없으면 배열의 이전 인덱스를 반환합니다.

func sectionIndexTitlesForTableView(tableView: UITableView) -> [String]? {
    return "ABCDEFGHIJKLMNOPQRSTUVWXYZ".characters.flatMap{String($0)}
}

func tableView(tableView: UITableView, sectionForSectionIndexTitle title: String, atIndex index: Int) -> Int {
    return self.headerTitles.filter{$0 <= title}.count - 1
}

MonoTouch를 사용하는 경우 섹션을 재정의합니다.UITableViewDataSource 클래스의 IndexTitles(UITableView) 메서드입니다.문자열 배열을 반환하고 하위 클래스가 나머지를 처리합니다.

class TableViewDataSource : UITableViewDataSource
{
  public override string[] SectionIndexTitles(UITableView tableView) 
  { 
    return new string[] { /*your string values */};
  }
}

*C# 및 Mono(.)를 사용하는 사용자를 위한 힌트일 뿐입니다.NET) iPhone 앱을 작성합니다.:)

언급URL : https://stackoverflow.com/questions/1655119/iphone-uitableview-how-do-turn-on-the-single-letter-alphabetical-list-like-the