UITableView зацикливание данных из NSMutableArray / NSDictionary - PullRequest
0 голосов
/ 21 июля 2009

В настоящее время я создаю приложение для iPhone, которое будет отображать данные из NSMutableArray, называемого «истории». Структура массива выглядит так (через NSLog):

    2009-07-20 12:38:30.541 testapp[4797:20b] (
    {
    link = "http://www.testing.com";
    message = "testing";
    username = "test";
},
    {
    link = "http://www.testing2.com";
    message = "testing2";
    username = "test2";
} )

Мой cellForRowAtIndexPath выглядит следующим образом:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];


}

    for (NSDictionary *story in stories) {
        [cell setTextColor:[UIColor whiteColor]];
        [cell setFont: [UIFont systemFontOfSize:11]];
        cell.text = [NSString stringWithFormat:[story objectForKey:@"message"]];
    }
            return cell;
}

В настоящее время мой UITableView отображает несколько записей одного и того же элемента (который является окончательным набором в массиве). Как я могу заставить его успешно проходить через массив и отображать сообщение следующего элемента в ячейках один за другим.

Заранее спасибо:)

Benji

Ответы [ 4 ]

5 голосов
/ 21 июля 2009

Вы неправильно понимаете, как работает метод cellForRowAtIndexPath:

Таким образом, вы создаете одну ячейку, а затем многократно сбрасываете свойства text, textColor и шрифта, а затем возвращаете одну ячейку.

Ключом к пониманию вашей проблемы является понимание того, что cellForRowAtIndexPath: вызывается несколько раз , один раз для каждой ячейки, которая будет отображаться на экране. Поэтому вместо цикла for () сделайте следующее:

NSDictionary * story = [stories objectAtIndex:[indexPath row]];
[cell setTextColor:[UIColor whiteColor]];
[cell setFont: [UIFont systemFontOfSize:11]];
cell.text = [NSString stringWithFormat:[story objectForKey:@"message"]];

Передаваемый параметр indexPath показывает, как tableView указывает, какую ячейку он запрашивает. Мы используем это, чтобы получить соответствующий словарь истории из вашего массива.

EDIT:

Я также хотел бы отметить, что этот код не совместим с iPhone OS 3.0. В 3.0 SDK внесены изменения в работу UITableViewCell, включая его иерархию представлений. Возможно, вы хотите получить доступ к textLabel ячейки, а затем установить свойства , что , например:

NSDictionary * story = [stories objectAtIndex:[indexPath row]];
[[cell textLabel] setTextColor:[UIColor whiteColor]];
[[cell textLabel] setFont: [UIFont systemFontOfSize:11]];
[[cell textLabel] setText:[NSString stringWithFormat:[story objectForKey:@"message"]]];
0 голосов
/ 21 июля 2009

Ваша проблема вот в этом

for (NSDictionary *story in stories) {       

[ячейка setTextColor: [UIColor whiteColor]];
[cell setFont: [UIFont systemFontOfSize: 11]];
cell.text = [NSString stringWithFormat: [story objectForKey: @ "message"]];
}

Вы устанавливаете свои ячейки так, чтобы всегда отображать последнюю историю, что вы хотите сделать, что-то вроде

NSDictionary *story = [stories objectAtIndex: indexPath.row];
cell.text=[NSString stringwithFormat:[story objectForKey@"message];
0 голосов
/ 21 июля 2009

вместо

for (NSDictionary *story in stories) {
    cell.text = [NSString stringWithFormat:[story objectForKey:@"message"]];
}

хочешь

int storyIndex = [indexPath indexAtPosition: [indexPath length] - 1];
cell.text = [NSString stringWithFormat:[[stories objectAtIndex: storyIndex] objectForKey:@"message"]];

Ваш cellForRowAtIndexPath метод будет вызываться один раз для каждой ячейки, поэтому вы хотите установить только текст для этой конкретной ячейки.

обратите внимание, что для простой таблицы без разделов "индексный путь" заканчивается просто как массив с одним целым числом в нем.

0 голосов
/ 21 июля 2009

Здесь не нужно иметь цикл - вам нужно использовать индекс ячейки таблицы и получить соответствующий элемент вашего массива (неясно, используете ли вы массив или словарь?) , Так, например, четвертый элемент вашего массива будет помещен в ячейку четвертой таблицы.

Вот исправление:

 NSDictionary *story = [stories objectAtIndex: indexPath.row];
cell.text=[NSString stringwithFormat:[story objectForKey@"message];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...