0

オンラインで見つけたチュートリアルに従って、カスタム オブジェクトの配列からセクションとインデックスを含むテーブルビューを作成しました。このコードは、テーブル内の行を選択すると、配列全体ではなく、そのセクションのインデックス パスになることを除いて機能します。機能しない理由はわかりますが、修正に対処する方法がわかりません。これは、テーブルビュー コードのセルです。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *CellIdentifier = @"NameCell";


UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
}



// Configure the cell...


    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    int displayOrder = [defaults integerForKey:@"displayOrder"];
    int sortOrder = [defaults integerForKey:@"sortOrder"];

    NSString *alphabet = [listIndex objectAtIndex:[indexPath section]];

    NSPredicate *sectionPredicate = [[NSPredicate alloc] init];

    if (sortOrder == 1) {  
        //NSLog(@"fName is predicate at cell level");
        sectionPredicate = [NSPredicate predicateWithFormat:@"fName beginswith[c] %@", alphabet];
    } else {
        //NSLog(@"lName is predicate at cell level");
        sectionPredicate = [NSPredicate predicateWithFormat:@"lName beginswith[c] %@", alphabet];
    }
    NSArray *sectionContacts = [filteredList filteredArrayUsingPredicate:sectionPredicate];

if (isSearching) {
    current = [filteredList objectAtIndex:indexPath.row];
} else{
    current = [sectionContacts objectAtIndex:indexPath.row];        
}

if (displayOrder == 1) {
    NSString *fullName = [NSString stringWithFormat:@"%@ %@",[current valueForKey:@"fName"],[current valueForKey:@"lName"]];
    [cell.textLabel setText:fullName];  
    //NSLog(@"FirstNameFirst");

} else {
    NSString *fullName = [NSString stringWithFormat:@"%@ %@",[current valueForKey:@"lName"],[current valueForKey:@"fName"]];
    [cell.textLabel setText:fullName];
    //NSLog(@"LastNameFirst");

}

    [cell.detailTextLabel setText:[current valueForKey:@"extension"]];

return cell;  }

次に、このコードでセグエを呼び出します。

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{

if ([segue.identifier isEqualToString:@"showContact"]) {

    DetailViewController *dvc = [segue destinationViewController];
    NSIndexPath *path = [self.tableView indexPathForSelectedRow];
    NSDictionary *c = [filteredList objectAtIndex:path.row];
    [dvc setCurrentContact:c];   
    [searchBar resignFirstResponder];
} }

問題は、objectAtIndex:path.row がそのセクションのインデックスを返しますが、配列全体では変更されないため、そのセクションのインデックス 4 にある「B」セクションの名前がタップされると、プライマリ配列のインデックス 4 のオブジェクト。そのセクションにのみローカルな配列ではなく、完全な配列のインデックスを取得する方法を理解するために頭を悩ませてきました。

ご協力いただければ、お好きな飲み物を 6 パックお買い上げいたします。

ありがとう!

4

1 に答える 1

0

最初の関数で行うのと同じ方法で行うので、prepareForSegue を次のように変更します。

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"showContact"]) {
        DetailViewController *dvc = [segue destinationViewController];
        NSIndexPath *path = [self.tableView indexPathForSelectedRow];

        NSDictionary *c;
        NSString *alphabet = [listIndex objectAtIndex:[path section]];
        NSPredicate *sectionPredicate = [[NSPredicate alloc] init];
        if (sortOrder == 1) {  
            sectionPredicate = [NSPredicate predicateWithFormat:@"fName beginswith[c] %@", alphabet];
        } else {
            sectionPredicate = [NSPredicate predicateWithFormat:@"lName beginswith[c] %@", alphabet];
        }
        NSArray *sectionContacts = [filteredList filteredArrayUsingPredicate:sectionPredicate];

        if (isSearching) {
            c = [filteredList objectAtIndex:path.row];
        } else{
            c = [sectionContacts objectAtIndex:path.row];        
        }

        [dvc setCurrentContact:c];   
        [searchBar resignFirstResponder];
    } 
}

このように 2 回使用するのではなく、共通のコードを取り出して別の関数を作成するのがおそらく最善であることに注意してください。

于 2012-04-06T03:38:06.417 に答える