ios: incrustación de anuncios en una vista uitable cada "x" células


He intentado incrustar anuncios de Google en una vista adecuada de las celdas "X", he seguido este tutorial: (http://googleadsdeveloper.blogspot.com/2012/03/embedding-google-admob-ads-within.html), pero descubro que la vista de tabla no siempre muestra todos los datos en la fuente de datos cuando agrego celdas para los anuncios, por lo general se apaga por unas pocas celdas. Creo que esto tiene que ver con la función numberOfRowsInInSection, pero por mi vida no puedo entender las matemáticaspara calcular esta corrección. Hasta ahora tengo lo siguiente: (kAdCellFrequency actualmente es 10, pero debería poder ajustarse a un valor arbitrario):

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

    id<NSFetchedResultsSectionInfo> sectionInfo = [[eventResults sections] objectAtIndex:0];
    int sectionObjectsCount = [sectionInfo numberOfObjects];
    int advertCellCount = ([sectionInfo numberOfObjects])/kAdCellFrequency;
    int additionalCellCount = sectionObjectsCount%kAdCellFrequency;
    NSLog(@"event count %i Ad cell count %i additional count %i total cell count %i cells",sectionObjectsCount, advertCellCount, additionalCellCount, sectionObjectsCount+advertCellCount+additionalCellCount);
    SDMEvent *theEvent = [[eventResults fetchedObjects]objectAtIndex:sectionObjectsCount-1];
    NSLog(@"Final object name %@",theEvent.eventName);
    return sectionObjectsCount+advertCellCount+additionalCellCount;
    //return sectionObjectsCount;
}

Agregué la variable adicionalCellCount porque cuando usaba el valor 10 para kAdCellFrequency, los datos estaban a 3 celdas de ser correctos, pero esta misma matemática no muestra la cantidad correcta si kAdCellFrequency se establece en 5.

La creación de las celdas celda de anuncio o celda de evento estándar:

 adCell = (UICellWithAdvert *) [tableView dequeueReusableCellWithIdentifier:@"UICellWithAdvert"];
        eventCell = (UISDMEventCell *) [tableView dequeueReusableCellWithIdentifier:@"UISDMEventCell"];

        NSLog(@"index: %i cell freq: %i result: %i",[indexPath row], kAdCellFrequency, [indexPath row]%kAdCellFrequency);
        if (([indexPath row] % kAdCellFrequency) == kAdCellFrequency-1) { // Advert cell dont add cell at index 0!

            if (!adCell) {
                NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"UICellWithAdvert" owner:nil options:nil];

                for(id currentObject in topLevelObjects){
                    if ([currentObject isKindOfClass:[UICellWithAdvert class]]) {
                        adCell = (UICellWithAdvert *)currentObject;
                    }
                }
            }

            // remove the advert from its current cell
            [googleAdvert removeFromSuperview];

            // add to cell if it doesn't have advert
            if (!googleAdvert.superview) {

                [adCell addSubview:googleAdvert];
                NSLog(@"Add cell with Advert");
            }

            return adCell;
        }
        else{ // event cell

            if (!eventCell) {
                NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"UISDMEventCell" owner:nil options:nil];

                for(id currentObject in topLevelObjects){
                    if ([currentObject isKindOfClass:[UISDMEventCell class]]) {
                        eventCell = (UISDMEventCell *)currentObject;
                    }
                }
            }

            return eventCell;
        }

La visualización del contenidoen el índice de la celda, eliminé la configuración real de los datos, solo necesito el cálculo:

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{

    int calculatedIndex = [indexPath row]-floor((float)[indexPath row]/kAdCellFrequency);
    NSLog(@"Calculated %i",calculatedIndex);
    NSLog(@"Normal Index %i",[indexPath row]);

}

Cualquier ayuda sería genial, incluso un puntero a algún lugar donde pueda aprender más sobre estas matemáticas.

Actualizar: De acuerdo, parece que el recuento de celdas regresa correctamente, pero en algunas ocasiones el código configura la duplicación del contenido de algunas celdas, por lo que, por ejemplo, las celdas 320 + 321 muestran el mismo evento. Creo que esto está relacionado con las siguientes matemáticas en mi código original (esto es pseudocódigo):

adCellFrequency = 10

cellIndex = 319 
int calculatedIndex = [indexPath row]-floor((float)[indexPath row]/kAdCellFrequency); // equals 288

cellIndex = 320 
int calculatedIndex = [indexPath row]-floor((float)[indexPath row]/kAdCellFrequency); // equals 288

Observe que los valores de ambas celdas son iguales a 288, lo que significa que ahora dos celdas muestran el mismo contenido. Entonces, la cantidad de celdas es correcta, pero el contenido presentado para el índice es incorrecto. (PaulW: este problema también ocurre cuando convertí su código, ¿está recibiendo esto? Estoy llegando al máximo de 325 celdas)



------------Respuesta------------

Enseñándote a pescar...

  1. Observe cómo se administra realmente el redondeo (consulte lrintf(), por ejemplo).archivo y ejecute algunas salidas de muestra de un rango de números usando un ciclo for/.
  2. ¿Por qué no enviar el valor del índice calculado a una etiqueta en la celda para que pueda visualizar el problema más claramente?
  3. Busca formas rápidas de visualizar las matemáticas; incluso una hoja de cálculo puede ayudar.

Etiquetas: objective-c uitableview ios gadbannerview

Artículos relacionados:

Código de nota: 1973 No se puede crear usuario, usuario, @, localhost,; ya existe, mysql

Spring: buen uso de entidades administradas/proxies con ORM