Как получить индекс каждого элемента в массиве Objective-C - PullRequest
1 голос
/ 08 сентября 2011

Для разрабатываемого приложения для iPhone мне нужно назначить пользовательские изображения uitableviewcell на основе целых чисел произвольных элементов в массиве. Во время некоторого тестирования я заметил, что indexPath строки возвращает только индексы для показанного представления, поэтому в основном мне нужно знать, как взять массив произвольного размера, скажем, сейчас у него есть 10 элементов, и эти 10 элементов находятся в таблица, каждый элемент ячейка, мне нужно, чтобы каждый элемент имел индекс, например, элемент 1 является индексом 0, элемент 2 является индексом 1 и так далее. Так что мой код будет читать, если индекс == 0, затем отображать это изображение в ячейке, если индекс! = 0, а затем отображать другое. Я попробовал это, но, как я уже сказал, если прокручивать до конца моего табличного представления, это переназначит любой элемент таблицы в верхней части представления на 0, так что я прокручивал изображения, которые продолжали изменяться. Поэтому в основном мне нужна помощь в назначении изображений на основе индекса в моем массиве, а не индекса таблицы.

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

    static NSString *MyIdentifier = @"MyIdentifier";

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

    cell.detailTextLabel.lineBreakMode = UILineBreakModeWordWrap;
    cell.detailTextLabel.numberOfLines = 1;
    cell.accessoryType =  UITableViewCellAccessoryDisclosureIndicator;

    NSString *title =[[stories objectAtIndex: indexPath.row] objectForKey: @"summary"];
    NSString *title2 =[[stories objectAtIndex: indexPath.row] objectForKey: @"title"];
    NSString *dayOfMonthString = [title substringWithRange: NSMakeRange(2, 2)];
    int dateChooser = [dayOfMonthString intValue];

    NSString *monthString = [title substringWithRange: NSMakeRange(0, 2)];

    int monthChooser = [monthString intValue];
    cell.textLabel.text =title2;


    cell.imageView.image = 
    [UIImage imageNamed: [NSString stringWithFormat: @"cal%d.png", dateChooser]];

    if (monthChooser == 1 && (INDEX COMPARISON CODE???){
        UIImageView *myImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Jan1.png"]];
        [cell setBackgroundView:myImageView];
    }

1 Ответ

4 голосов
/ 08 сентября 2011

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

Бьюсь об заклад, ваша проблема в том, что вы неправильно используете механизм повторного использования UITableViewCells .Когда вы прокручиваете свой TableView, UITableViewCells, которые больше не отображаются на экране, «перерабатываются» и повторно используются для отображения новых ячеек на экране, чтобы избежать слишком больших выделений и бесполезных инициализаций, которые иначе замедлили бы прокрутку вашего tableView.

Правильный шаблон кода для возврата ячейки следующий:

-(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{
    // Try to retrieve a previously created cell that is not used anymore
    // That's the "recycling" part, we try to reuse a cell instead of creating a new one if possible
    UITableViewCell* cell = [tableView dequeueCellWithIdentifier:@"myIdentifier"];

    if (cell == nil)
    {
        // We failed to recycle a previously created cell, so we have no choice to allocate a new one
        cell = [[[UITableViewCell alloc] initWithStyle:... reuseIdentifier:@"myIdentifier"] autorelase];
        // As we just created the cell, we configure everything that will be common to every cell
        // and that won't change even if the cell is reused later when you scroll

        // e.g. text color, text font, accessoryType, ...
        cell.textLabel.textColor = [UIColor blueColor];
        ...
    }

    // Now we got here either with a brand new cell that have just been created…
    // … or after reusing an old cell that were not onscreen and has been recycled
    // So THIS IS THE PLACE to configure everything that is SPECIFIC to each cell

    // namely cell text, especially
    cell.textLabel.text = [yourDataArray objectAtIndex: indexPath.row];


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