2009-07-21 3 views
0

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

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 отображает несколько записей одного и того же элемента (что происходит, чтобы быть окончательный набор в массиве). Как я могу получить его, чтобы успешно пройти через массив и отобразить сообщение следующего элемента в ячейках один за другим.

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

Бенджи

ответ

5

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

Как у вас есть это, вы создаете одну ячейку, а затем повторно устанавливаете ее текст, свойства textColor и шрифта, а затем возвращаете одну ячейку.

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

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 совместимы. В SDK 3.0 были внесены изменения в работу 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

Привет, Dave, Спасибо за полезный пост и 3.0 точки совместимости, по какой-то причине он, похоже, рушится для меня с ошибкой: «*** Завершение приложения из-за неперехваченного исключения« NSRangeException », причина: '** * - [NSCFArray objectAtIndex:]: индекс (2) за пределами границ (2) '" Еще раз спасибо. –

+1

@Benji означает, что у вас есть только 2 элемента в вашем массиве, но tableView запрашивает третью. Убедитесь, что вы возвращаете [количество историй] в свой метод делегирования numberOfRowsInSection. Если да, то убедитесь, что вы не мутируете NSArray за кулисами и добавляете/удаляете из него вещи, не сообщая tableview (вы скажете это, отправив ему сообщение reloadData). –

+0

Дэйв, ты гений, я не вернулся [истории]. Еще раз спасибо и отлично провели день :) –

0

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

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

NSDictionary *story = [stories objectAtIndex: indexPath.row]; 
cell.text=[NSString stringwithFormat:[story [email protected]"message]; 
0

Ваша проблема здесь это

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 [email protected]"message]; 
0

вместо

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 получит вызов onc e для каждой ячейки, поэтому вы хотите только установить текст для этой конкретной ячейки.

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

+0

, что случилось с storyIndex межд? –

+0

виновен в копировании кода из чужого плохих примеров назад месяц назад, когда я действительно не понимал, что такое indexPaths, и, по-видимому, автор не знал об iPhone-специфических методах «строка» и «секция» .... –