1

我用我的表设置了一个索引,我能够根据节标题为 textLabel.text 返回正确的数组。我的问题是我需要在 detailTextLabel.text 中返回一个单独的数组。

它只是从第一节的第一个索引开始在每个节中重复。例如:

一个

苹果

苹果

鳄鱼

鳄鱼

苹果

蝙蝠

鳄鱼


我已经生成了索引字符和表头。这就是我必须返回的单元格。

NSString *alphabet = [arrayIndex objectAtIndex:[indexPath section]];
            //---get all of First array's beginning with the letter---
            NSPredicate *predicate =
            [NSPredicate predicateWithFormat:@"SELF beginswith[c] %@", alphabet];
            NSArray *firstArray = [First filteredArrayUsingPredicate:predicate]; 
            NSArray *secondArray = [Second filteredArrayUsingPredicate:predicate]; 

    if ([FirstArray count]>0) {
        //---extract the relevant state from the states object---
        NSString *cellValue = [firstArray objectAtIndex:indexPath.row];



      //<--This line throws and error assuming it is trying to find the first letter to return the detail text -->  
    NSString *cellValueA = [secondArray objectAtIndex:indexPath.row];
//Returns value from first section and row in all section//
            //NSString *cellValueA = [Second objectAtIndex:indexPath.row]; 
            cell.textLabel.text = cellValue;
            cell.detailTextLabel.text = cellValueA;
            cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
        }    

如何找到第一个数组的匹配行以在第二个数组中返回正确的索引。任何帮助将非常感激。谢谢你 :-)


完整代码

-(void)loadSQL {
    // Path to the database
    NSString* dbPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"DATABASE_NAME.sqlite"];
    NSLog(@"databasePath: %@",dbPath);
    sqlite3 *database;
    NSString *firstString;
    NSString *secondString;

    // Open the database
    if (sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK) {
        NSString *querySQL = [NSString stringWithFormat: 
                              @"SELECT * FROM songs WHERE items LIKE %@ ", viewItems];

        const char *sql = [querySQL UTF8String];

        sqlite3_stmt *compiledStmt;
        // Fetch all names
        if (sqlite3_prepare_v2(database, sql, -1, &compiledStmt, NULL) == SQLITE_OK) {
            // Append each name
            while (sqlite3_step(compiledStmt) == SQLITE_ROW) {

                const char* cFirst = (char*)sqlite3_column_text(compiledStmt, 2);
                        const char* cSecond = (char*)sqlite3_column_text(compiledStmt, 3);

                if (cFirst == NULL)
                    // There should not be a NULL name
                    NSLog(@"Null name!!");

                else {
                firstString = [NSString stringWithUTF8String:cName];
                            secondString = [NSString stringWithUTF8String:cArtist];

                [First addObject:firstString];
                [Second addObject:secondString];


                    //[First release];
                    //[Second release];
                }
            }
            sqlite3_finalize(compiledStmt); // Cleanup the statement
        }
        else {
            NSLog(@"Error retrieving data from database.");
        }
        sqlite3_close(database);
    }
    else {
        NSLog(@"Error: Can't open database!");
    }

//Creating section with 1st letter of the First field//
    for (int i=0; i<[First count]-1; i++){
        //---get the first char of each state---
        char alphabet = [[First objectAtIndex:i] characterAtIndex:0];
        NSString *uniChar = [NSString stringWithFormat:@"%C", alphabet];
        //---add each letter to the index array---
        if (![arrayIndex containsObject:uniChar])
        {
            [arrayIndex addObject:uniChar];
        }
    }         
}





#pragma mark Table view methods

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    if (searching)
        return 1;
    else
        return [arrayIndex count];
}

//---set the title for each section---
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    if (searching)
        return nil;

    else        
        return [arrayIndex objectAtIndex:section];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    if (searching)
        return([searchedFirst count]);
    else{
        //return([First count]);
        NSString *alphabet = [songIndex objectAtIndex:section];
        NSPredicate *predicate =[NSPredicate predicateWithFormat:@"SELF beginswith[c] %@", alphabet];
        NSArray *firstArray = [First filteredArrayUsingPredicate:predicate];
        return [firstArray count];

    }
}

//---set the index for the table---
- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView {

    if (searching) {
        return nil;
    }

    return arrayIndex;
}


//return the cell info
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";

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

    if(searching) {
        cell.textLabel.text =  [searchedFirst objectAtIndex:indexPath.row];
        cell.detailTextLabel.text = [searchedSecond objectAtIndex:indexPath.row];
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    }
    else{
        //---get the letter in the current section---
        NSString *alphabet = [arrayIndex objectAtIndex:[indexPath section]];
        //---get all states beginning with the letter---
        NSPredicate *predicate =
        [NSPredicate predicateWithFormat:@"SELF beginswith[c] %@", alphabet];
        NSArray *firstArray = [First filteredArrayUsingPredicate:predicate]; 
        NSArray *secondArray = [Second filteredArrayUsingPredicate:predicate]; 

        if ([songArray count]>0) {
            NSString *firstValue = [firstArray objectAtIndex:indexPath.row];
            NSString *secondValue = [secondArray objectAtIndex:indexPath.row];

            cell.textLabel.text = firtValue;
            cell.detailTextLabel.text = secondValue;
            cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
        }

    }
    return cell;


}
4

2 回答 2

0

我不确定我是否理解您的需求,但如果您正在寻找给定对象数组中的索引,那么您可以使用:

索引对象:

返回其对应数组值等于给定对象的最低索引。

   - (NSUInteger)indexOfObject:(id)anObject

参考

于 2012-06-28T15:58:54.717 回答
0

从有关重组的评论中回答问题....

首先,创建一个自定义类:

// CellLabels.h
#import <Foundation/Foundation.h>

@interface CellLabels : NSObject
@property (nonatomic, copy) NSString *firstText;
@property (nonatomic, copy) NSString *secondText;
@end

//CellLabels.m
#import "CellLabels.h"

@implementation CellLabels
@synthesize firstText = _firstText;
@synthesize secondText = _secondText;
@end

代替Firstand Second,创建并初始化一个NSMutableArray名为cellData. 代替...

[First addObject:firstString];
[Second addObject:secondString];

...和...

CellLabels *labels = [[CellLabels alloc] init];
labels.first = firstString;
labels.second = secondString;
[cellData addObject:labels];

然后,您的数组过滤通过比较“SELF.firstText”来工作,您的数组引用通过使用:

CellLabels *labels = [filteredArray objectAtIndex:indexPath.row];
cell.textLabel.text = labels.firstText;
cell.detailTextLabel.text = labels.secondText;

(好吧,我没有检查以确保所有这些都已编译,但它应该会给你这个想法。)

于 2012-06-28T18:09:12.960 回答