как вызывается функция в xcode - PullRequest
0 голосов
/ 14 июня 2011

я новичок в xcode, и я делаю этот код, чтобы заполнить табличное представление заголовками аннотаций, но функция вызывается более одного раза, а ячейки таблицы заполняются всеми повторяющимися значениями, как эта функция вызывается в xcode, какмогу ли я прекратить вызывать эту функцию более одного раза

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{    
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) 
    {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }
    NSLog(@"this is a test text            ");
    NSMutableArray *annotations = [[NSMutableArray alloc] init];
    int i=0;
    if(indexPath.section == 0)
    {
        for(iCodeBlogAnnotation *annotation in [map annotations])
        {
            i++;
            NSLog(@"this is the no %d",i);
            [annotations addObject:annotation]; 
        }

        cell.textLabel.text = [[annotations objectAtIndex:indexPath.row] title];
    }

    return cell;
}

Любая помощь будет принята с благодарностью, Спасибо за вашу помощь заранее

Ответы [ 3 ]

2 голосов
/ 14 июня 2011

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

Вам не нужно создавать временный массив при каждом вызове этой функции, просто используйте [map annotations] напрямую:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    // There will be one row per annotation
    return [[map annotations] count]
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{    
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) 
    {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

    // Put the text from this annotation into this cell
    cell.textLabel.text = [[[map annotations] objectAtIndex:indexPath.row] title];

    return cell;
}

Надеюсь, я понял ваш вопрос.Если нет, пожалуйста, сообщите мне в комментариях ниже!

1 голос
/ 14 июня 2011

Это не функция, это метод.

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

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

Спрашивает "как я могу остановить эту функцию от вызова более одного раза?" указывает на то, что вы не понимаете представления таблиц (это сбивает с толку, если вы пришли из «толкающей» модели программирования пользовательского интерфейса). Начните с Руководство по программированию TableView .

0 голосов
/ 14 июня 2011

Функция вызывается всякий раз, когда UITableView еще не имеет UITableViewCell для определенного пути индекса и нуждается в нем. Обратите внимание, что он может вызываться несколько раз для пути индекса в результате прокрутки пользователем (для экономии памяти, ячейки, находящиеся вне экрана, могут быть повторно использованы или освобождены) или при вызовах reloadData и связанных функций или insertRowsAtIndexPaths:withRowAnimation: и связанных функций , Вы не можете (и действительно не хотите) предотвращать его повторный вызов более одного раза.

Тем не менее, предполагая, что [map annotations] возвращает упорядоченную коллекцию некоторого вида, упорядоченную одинаково каждый раз, ваш код должен делать то, что вы хотите (даже если он очень неэффективен). Было бы полезно подробнее рассказать о проблеме.

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