我在 uitableview 中使用广告,列表中每第 4 个左右的项目就是一个广告
i'm using ads within a uitableview, where every 4th item or so in the list is an ad
我在 UITableView
中使用广告,列表中每第 4 个左右的项目就是一个广告。它有效,但广告占据了对象的位置,例如 1-2-3-ad-5-6-7-ad 而不是 1-2-3-ad-4-5-6-ad
我的UITableView
方法
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 2;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
if (section==0)
{
return 0;
}
else{
return [self.articlesArray count];
}
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
NSInteger row = [indexPath row];
if (3 == (row % 4)) { // or 0 == if you want the first cell to be an ad!
static NSString *MyIdentifier = @"AdCell";
AdViewCell *cell = (AdViewCell *)[tableView dequeueReusableCellWithIdentifier:MyIdentifier];
if ((cell == nil) || (![cell isKindOfClass: AdViewCell.class] {
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"AdCell" owner:self options:nil];
cell = [nib objectAtIndex:0];
cell = [[AdViewCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:MyIdentifier] ;
}
GADBannerView *bannerView = [[GADBannerView alloc] initWithAdSize:kGADAdSizeMediumRectangle];
bannerView =[[GADBannerView alloc] initWithFrame:CGRectMake(width,heigth,300,250)];
bannerView.adUnitID =@"";
bannerView.rootViewController =self;
GADRequest *request = [GADRequest request];
[bannerView loadRequest:request];
[cell.contentView addSubview:bannerView];
return cell;
}
else {
static NSString *simpleTableIdentifier = @"ArticleCell";
ArticleViewCell *cell = (ArticleViewCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier ];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
if ((cell == nil) || (![cell isKindOfClass: ArticleViewCell.class]))
{
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"ArticleCell" owner:self options:nil];
cell = [nib objectAtIndex:1];
cell = [[ArticleViewCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:simpleTableIdentifier] ;
}
NSInteger offset = indexPath.row / 4;
NSInteger roww = indexPath.row - offset;
NSDictionary * tempDictionary = [self.articlesArray objectAtIndex:roww];
NSString *imageUrl = [[self.articlesArray objectAtIndex:indexPath.row]objectForKey:@"featured_image_thumbnail_tab_url"];
imageUrl = [imageUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
[cell.thumbnailImageView sd_setImageWithURL:[NSURL URLWithString:imageUrl ] placeholderImage:nil options:SDWebImageRetryFailed completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
if (image) {
// Set your image over here
}else{
//something went wrong
NSLog(@"Error occured : %@", [error description]);
}
}];
NSString * title=[tempDictionary valueForKeyPath:@"title.rendered"];
cell.titleLabel.text = title;
NSString * excerpt=[tempDictionary valueForKeyPath:@"excerpt.rendered"];
NSString *excerpt_rend =[self convertHTML:excerpt];
cell.excerptLabel.text = excerpt_rend;
return cell;
}
}
#pragma mark - Navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([[segue identifier] isEqualToString:@"showarticle"]){
NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
DGArticleViewController *articleViewController = (DGArticleViewController *)segue.destinationViewController;
articleViewController.articlesDetails = [self.articlesArray objectAtIndex:rowww]; //rowww = roww
NSLog(@"data article %@",articleViewController.articlesDetails);
}
}
您必须调整 indexpath.row 以反映跳过的单元格。因此,在您的其他部分中,将 indexPath.row 替换为 adjustedRow number.
else
{
static NSString *simpleTableIdentifier = @"ArticleCell";
ArticleViewCell *cell = (ArticleViewCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier ];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
if ((cell == nil) || (![cell isKindOfClass: ArticleViewCell.class]))
{
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"ArticleCell" owner:self options:nil];
cell = [nib objectAtIndex:1];
cell = [[ArticleViewCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:simpleTableIdentifier] ;
}
NSInteger adjustedRow = indexPath.row - indexPath.row/4;
NSDictionary * tempDictionary = [self.articlesArray objectAtIndex:adjustedRow];
NSString *imageUrl = [[self.articlesArray objectAtIndex:adjustedRow]objectForKey:@"featured_image_thumbnail_tab_url"];
imageUrl = [imageUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
[cell.thumbnailImageView sd_setImageWithURL:[NSURL URLWithString:imageUrl ] placeholderImage:nil options:SDWebImageRetryFailed completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
if (image){
// Set your image over here
}else{
//something went wrong
NSLog(@"Error occured : %@", [error description]);
}
}];
NSString * title=[tempDictionary valueForKeyPath:@"title.rendered"];
cell.titleLabel.text = title;
NSString * excerpt=[tempDictionary valueForKeyPath:@"excerpt.rendered"];
NSString *excerpt_rend =[self convertHTML:excerpt];
cell.excerptLabel.text = excerpt_rend;
return cell;
}
引入显示广告数量的偏移量:
NSInteger offset = indexPath.row / 4
NSIngteger adjustedRow = indexPath.row - offset
// use row from adjustedRow, instead of indexPath.row
NSDictionary * tempDictionary = [self.articlesArray objectAtIndex:adjustedRow];
...
NSString *imageUrl = [[self.articlesArray objectAtIndex:adjustedRow]objectForKey:@"featured_image_thumbnail_tab_url"];
此外,numberOfRowsInSection:
需要调整,否则您将缺少项目:
return [self.articlesArray count] + [self.articlesArray count] / 4;
在prepareForSegue
中:
NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
NSInteger *adjusted = indexPath.row - indexPath.row / 4
...
articleViewController.articlesDetails = [self.articlesArray objectAtIndex:adjusted];
...
测试:
for (int testIndexPathRow = 0; testIndexPathRow < 100; ++testIndexPathRow) {
if (3 == testIndexPathRow % 4) {
NSLog(@"Ad");
} else {
NSInteger offset = testIndexPathRow / 4;
NSInteger row = testIndexPathRow - offset;
NSLog(@"data at index: %d", row);
}
}
打印:
2016-11-11 12:09:16.927 TEST[7126:382810] data at index: 0
2016-11-11 12:09:16.927 TEST[7126:382810] data at index: 1
2016-11-11 12:09:16.927 TEST[7126:382810] data at index: 2
2016-11-11 12:09:16.928 TEST[7126:382810] Ad
2016-11-11 12:09:16.928 TEST[7126:382810] data at index: 3
2016-11-11 12:09:16.928 TEST[7126:382810] data at index: 4
2016-11-11 12:09:16.928 TEST[7126:382810] data at index: 5
2016-11-11 12:09:16.928 TEST[7126:382810] Ad
2016-11-11 12:09:16.928 TEST[7126:382810] data at index: 6
...
例如,您有 8 行的数组,您还想要 2 个广告,即总共 10 行。但是您只传递了会产生问题的数组计数。要解决此问题,请遵循以下代码
(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
if (section==0)
{
return 0;
}
else
{
return [self.articlesArray count] + ([self.articlesArray count]/4);
}
}
如下所示从数组中获取数据,一定会对你有所帮助
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
//Your current code
int index = indexPath.row/4
NSDictionary * tempDictionary = [self.articlesArray objectAtIndex:indexPath.row-index];
//Your current code
}
我在 UITableView
中使用广告,列表中每第 4 个左右的项目就是一个广告。它有效,但广告占据了对象的位置,例如 1-2-3-ad-5-6-7-ad 而不是 1-2-3-ad-4-5-6-ad
我的UITableView
方法
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 2;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
if (section==0)
{
return 0;
}
else{
return [self.articlesArray count];
}
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
NSInteger row = [indexPath row];
if (3 == (row % 4)) { // or 0 == if you want the first cell to be an ad!
static NSString *MyIdentifier = @"AdCell";
AdViewCell *cell = (AdViewCell *)[tableView dequeueReusableCellWithIdentifier:MyIdentifier];
if ((cell == nil) || (![cell isKindOfClass: AdViewCell.class] {
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"AdCell" owner:self options:nil];
cell = [nib objectAtIndex:0];
cell = [[AdViewCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:MyIdentifier] ;
}
GADBannerView *bannerView = [[GADBannerView alloc] initWithAdSize:kGADAdSizeMediumRectangle];
bannerView =[[GADBannerView alloc] initWithFrame:CGRectMake(width,heigth,300,250)];
bannerView.adUnitID =@"";
bannerView.rootViewController =self;
GADRequest *request = [GADRequest request];
[bannerView loadRequest:request];
[cell.contentView addSubview:bannerView];
return cell;
}
else {
static NSString *simpleTableIdentifier = @"ArticleCell";
ArticleViewCell *cell = (ArticleViewCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier ];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
if ((cell == nil) || (![cell isKindOfClass: ArticleViewCell.class]))
{
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"ArticleCell" owner:self options:nil];
cell = [nib objectAtIndex:1];
cell = [[ArticleViewCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:simpleTableIdentifier] ;
}
NSInteger offset = indexPath.row / 4;
NSInteger roww = indexPath.row - offset;
NSDictionary * tempDictionary = [self.articlesArray objectAtIndex:roww];
NSString *imageUrl = [[self.articlesArray objectAtIndex:indexPath.row]objectForKey:@"featured_image_thumbnail_tab_url"];
imageUrl = [imageUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
[cell.thumbnailImageView sd_setImageWithURL:[NSURL URLWithString:imageUrl ] placeholderImage:nil options:SDWebImageRetryFailed completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
if (image) {
// Set your image over here
}else{
//something went wrong
NSLog(@"Error occured : %@", [error description]);
}
}];
NSString * title=[tempDictionary valueForKeyPath:@"title.rendered"];
cell.titleLabel.text = title;
NSString * excerpt=[tempDictionary valueForKeyPath:@"excerpt.rendered"];
NSString *excerpt_rend =[self convertHTML:excerpt];
cell.excerptLabel.text = excerpt_rend;
return cell;
}
}
#pragma mark - Navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([[segue identifier] isEqualToString:@"showarticle"]){
NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
DGArticleViewController *articleViewController = (DGArticleViewController *)segue.destinationViewController;
articleViewController.articlesDetails = [self.articlesArray objectAtIndex:rowww]; //rowww = roww
NSLog(@"data article %@",articleViewController.articlesDetails);
}
}
您必须调整 indexpath.row 以反映跳过的单元格。因此,在您的其他部分中,将 indexPath.row 替换为 adjustedRow number.
else
{
static NSString *simpleTableIdentifier = @"ArticleCell";
ArticleViewCell *cell = (ArticleViewCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier ];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
if ((cell == nil) || (![cell isKindOfClass: ArticleViewCell.class]))
{
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"ArticleCell" owner:self options:nil];
cell = [nib objectAtIndex:1];
cell = [[ArticleViewCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:simpleTableIdentifier] ;
}
NSInteger adjustedRow = indexPath.row - indexPath.row/4;
NSDictionary * tempDictionary = [self.articlesArray objectAtIndex:adjustedRow];
NSString *imageUrl = [[self.articlesArray objectAtIndex:adjustedRow]objectForKey:@"featured_image_thumbnail_tab_url"];
imageUrl = [imageUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
[cell.thumbnailImageView sd_setImageWithURL:[NSURL URLWithString:imageUrl ] placeholderImage:nil options:SDWebImageRetryFailed completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
if (image){
// Set your image over here
}else{
//something went wrong
NSLog(@"Error occured : %@", [error description]);
}
}];
NSString * title=[tempDictionary valueForKeyPath:@"title.rendered"];
cell.titleLabel.text = title;
NSString * excerpt=[tempDictionary valueForKeyPath:@"excerpt.rendered"];
NSString *excerpt_rend =[self convertHTML:excerpt];
cell.excerptLabel.text = excerpt_rend;
return cell;
}
引入显示广告数量的偏移量:
NSInteger offset = indexPath.row / 4
NSIngteger adjustedRow = indexPath.row - offset
// use row from adjustedRow, instead of indexPath.row
NSDictionary * tempDictionary = [self.articlesArray objectAtIndex:adjustedRow];
...
NSString *imageUrl = [[self.articlesArray objectAtIndex:adjustedRow]objectForKey:@"featured_image_thumbnail_tab_url"];
此外,numberOfRowsInSection:
需要调整,否则您将缺少项目:
return [self.articlesArray count] + [self.articlesArray count] / 4;
在prepareForSegue
中:
NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
NSInteger *adjusted = indexPath.row - indexPath.row / 4
...
articleViewController.articlesDetails = [self.articlesArray objectAtIndex:adjusted];
...
测试:
for (int testIndexPathRow = 0; testIndexPathRow < 100; ++testIndexPathRow) {
if (3 == testIndexPathRow % 4) {
NSLog(@"Ad");
} else {
NSInteger offset = testIndexPathRow / 4;
NSInteger row = testIndexPathRow - offset;
NSLog(@"data at index: %d", row);
}
}
打印:
2016-11-11 12:09:16.927 TEST[7126:382810] data at index: 0
2016-11-11 12:09:16.927 TEST[7126:382810] data at index: 1
2016-11-11 12:09:16.927 TEST[7126:382810] data at index: 2
2016-11-11 12:09:16.928 TEST[7126:382810] Ad
2016-11-11 12:09:16.928 TEST[7126:382810] data at index: 3
2016-11-11 12:09:16.928 TEST[7126:382810] data at index: 4
2016-11-11 12:09:16.928 TEST[7126:382810] data at index: 5
2016-11-11 12:09:16.928 TEST[7126:382810] Ad
2016-11-11 12:09:16.928 TEST[7126:382810] data at index: 6
...
例如,您有 8 行的数组,您还想要 2 个广告,即总共 10 行。但是您只传递了会产生问题的数组计数。要解决此问题,请遵循以下代码
(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
if (section==0)
{
return 0;
}
else
{
return [self.articlesArray count] + ([self.articlesArray count]/4);
}
}
如下所示从数组中获取数据,一定会对你有所帮助
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
//Your current code
int index = indexPath.row/4
NSDictionary * tempDictionary = [self.articlesArray objectAtIndex:indexPath.row-index];
//Your current code
}