1

テーブルにインデックスを設定しました。セクション ヘッダーに従って、textLabel.text の正しい配列を返すことができます。私の問題は、detailTextLabel.text で返す必要がある別の配列があることです。

最初のセクションの最初のインデックスから始まる各セクションで繰り返されます。例えば:

アップル

りんご

アリゲーター

アリゲーター

B

ボール

りんご

バット

アリゲーター


インデックス文字とテーブル ヘッダーを生成しました。これは、セルを返さなければならないものです。

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;
        }    

最初の配列に一致する行を見つけて、2 番目の配列に正しいインデックスを返すにはどうすればよいですか。どんな助けでも大歓迎です。ありがとうございました :-)


完全なコード

-(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

との代わりに、Firstと呼ばれるSecondものを作成して初期化します。交換...NSMutableArraycellData

[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;

(OK、すべてがコンパイルされていることを確認するためにチェックしませんでしたが、アイデアが得られるはずです。)

于 2012-06-28T18:09:12.960 に答える