Итерация по NSMutableArray объектов - PullRequest
1 голос
/ 18 декабря 2011

У меня есть класс со следующим свойством и методом:

заголовочный файл ниже - обратите внимание, я не скопировал / вставил весь код (только соответствующую информацию):

@interface SQLiteDB : NSObject

@property (nonatomic, strong) NSMutableArray *allAccountsArray;
@property (nonatomic, strong) NSString *accountId, *accountName, *accountDescription, *accountTags, *accountPhoto, *accountCreationDate;

+(id) populateAccountObjectWithId:(NSString *)id andName:(NSString *)name andDescription:(NSString *)description andTags:(NSString *)tags andPhoto:(NSString *)photo andCreationDate:(NSString *)creationDate;

@end

файл реализации ниже - обратите внимание, что я не копировал / вставлял весь код (только соответствующую информацию):

+(id) populateAccountObjectWithId:(NSString *)id andName:(NSString *)name andDescription:(NSString *)description andTags:(NSString *)tags andPhoto:(NSString *)photo andCreationDate:(NSString *)creationDate
{
    SQLiteDB *mySQLiteDB = [[self alloc] init];
    mySQLiteDB.accountId = id;
    mySQLiteDB.accountName = name;
    mySQLiteDB.accountDescription = description;
    mySQLiteDB.accountTags = tags;
    mySQLiteDB.accountPhoto = photo;
    mySQLiteDB.accountCreationDate = creationDate;
    return mySQLiteDB;
}

Затем другой метод в файле реализации извлекает все учетные записи из базы данных SQLite:

-(id) fetchAccountList
{   
    // do some database stuff here
    // create prepared statement, open database, etc...

    allAccountsArray = [[NSMutableArray alloc] init];

    while(sqlite3_step(statement) == SQLITE_ROW)
    {
        NSString *thisAccountId =              [[NSString alloc] initWithUTF8String:(const char *) sqlite3_column_text(statement,0)];
        NSString *thisAccountName =            [[NSString alloc] initWithUTF8String:(const char *) sqlite3_column_text(statement, 1)];
        NSString *thisAccountDescription =     [[NSString alloc] initWithUTF8String:(const char *) sqlite3_column_text(statement, 2)];
        NSString *thisAccountTags =            [[NSString alloc] initWithUTF8String:(const char *) sqlite3_column_text(statement, 3)];
        NSString *thisAccountPhoto =           [[NSString alloc] initWithUTF8String:(const char *) sqlite3_column_text(statement, 4)];
        NSString *thisAccountCreationDate =    [[NSString alloc] initWithUTF8String:(const char *) sqlite3_column_text(statement, 5)];

        [allAccountsArray addObject:[SQLiteDB populateAccountObjectWithId:thisAccountId andName:thisAccountName andDescription:thisAccountDescription andTags:thisAccountTags andPhoto:thisAccountPhoto andCreationDate:thisAccountCreationDate]];

    }
    // error handling code, etc.
    // finalize, & close code here...

return allAccountsArray;

}

Теперь наконец вопрос. В других классах я хочу делать вещи с массивом объектов, которые это возвращает. Например, я бы сделал это в контроллере TableVeiw:

-(void)loadView
{
    [super loadView];

    mySQLiteDB = [[SQLiteDB alloc] init];
    allAccountsArray = [mySQLiteDB fetchAccountList]; 
}

Я бы использовал это позже, например, для заполнения списка таблиц в методе cellForRowAtIndexPath. Возможно, каждая ячейка таблицы будет содержать accountName, accountDescription и accountCreationDate. Однако я не знаю, как получить доступ к этому имени, desc, date из массива объектов ...

Это, очевидно, приводит к ошибке:

cell.textLabel.text = [allAccountsArray objectAtIndex:indexPath.row];

потому что объект в строке представляет собой «объект», содержащий имя, описание, дату и т. Д. *

Итак, Stackoverflow, я вас спрашиваю ... Как мне получить переменные объекта в каждом элементе массива?

Ответы [ 2 ]

2 голосов
/ 18 декабря 2011

Вы должны быть в состоянии сделать что-то простое, как это:

SqliteDB *mySqliteDB = (SQliteDB *)[allAccountsArray objectAtIndex:indexPath.row];
NSString *myText = mySqliteDB.thisAccountID;
myText = [myText stringByAppendingString:mySqliteDB.thisAccountName];
.... etc.
cell.textLabel.text = myText;
1 голос
/ 18 декабря 2011

Я думаю, enumerateObjects:usingBlock: - это то, что вы хотите для итерации, то есть для перечисления объектов.Возможно, вы пропустили его, потому что он в суперклассе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...