仅将 UIImageView 应用于 UITableView 中的特定部分

Posted

技术标签:

【中文标题】仅将 UIImageView 应用于 UITableView 中的特定部分【英文标题】:Applying a UIImageView to only a specific section in a UITableView 【发布时间】:2015-11-24 12:43:22 【问题描述】:

我有一个简单的应用程序,它由一个 UITabBar 组成,其中每个 Tab 是一个 UITableViewController。出于这个问题的目的,我将只关注名为Videos(第一个选项卡)的UITableViewController 和另一个名为Languages(第二个选项卡)的UITableViewController

Videos 选项卡由视频列表的一部分组成。 Languages 选项卡包含两个部分,其中section 0 是传单,section 1 = 与视频选项卡相同的相应视频。

例如,如果Videos 选项卡有:

视频 10010

视频 20010

视频 30010

视频 40010

视频 50010

那么Languages tab section 1 也会有:

视频 10010

视频 20010

视频 30010

视频 40010

视频 50010

我有一些代码在已选择的任何单元格上加上一个星号,并且该单元格的标题被添加到 Core Data(将显示在名为 Favourites 的第三个选项卡中 - 但这并不重要对于这个问题)。

我想确保应用程序内的一致性,所以如果我在Videos 选项卡中的Video 20010 中放置一个星号,我想确保语言中的Video 20010 也有一个星号。

那部分有效。然而,问题是星被放置在传单部分 (section 0) 以及 Languages 选项卡的 Videos 部分 (section 1) 中。

这是Languages 标签中cellForRow 的部分代码。

// This code is important because I might set the Leaflets section to be a favourite from within the Languages tab (not related to the Videos tab, etc). 

if(indexPath.section==0)

    customCell.customCellLabel.text = [NSString stringWithFormat:@"%@",[self.availableLeaflets objectAtIndex:indexPath.row]];
    NSString *key = [NSString stringWithFormat:@"%@_%ld_%ld", self.selectedLanguage, (long)indexPath.section, (long)indexPath.row];
    if (self.favoritesDict[key]) 
        // show the favorite image
        customCell.customCellImage.hidden = NO;
     else 
        // hide the favorite image
        customCell.customCellImage.hidden = YES;
    

else

    customCell.customCellLabel.frame = CGRectMake(8, 20, 100, 40);
    customCell.customCellLabel.text = [NSString stringWithFormat:@"%@",[self.availableVideos objectAtIndex:indexPath.row]];

    NSString *key = [NSString stringWithFormat:@"%@_%ld_%ld", self.selectedLanguage, (long)indexPath.section, (long)indexPath.row];
    if (self.favoritesDict[key]) 
        // show the favorite image
        customCell.customCellImage.hidden = NO;
     else 
        // hide the favorite image
        customCell.customCellImage.hidden = YES;
    



NSManagedObjectContext *context = [self managedObjectContext];
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Favourites"];
request.predicate = [NSPredicate predicateWithFormat:@"title != nil"];
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"title" ascending:YES];
request.sortDescriptors = [NSArray arrayWithObject:sortDescriptor];

NSError *error = nil;
NSArray *favs = [context executeFetchRequest:request error:&error];    
if (!favs)

    NSLog(@"Nothing to see here");

else

    NSLog(@"Number of objects %lu", [favs count]);
    for (Favourites *favourite in favs)
    
        NSString *string = [NSString stringWithFormat:@"%@", favourite.title];
        favourite.title = string;
        NSLog(@"The favourite titles are %@", favourite.title);

        if ([customCell.customCellLabel.text isEqualToString:favourite.title])
        

            customCell.customCellImage.hidden = NO;
        
    


更新

当某个单元格被收藏时,会发生以下情况:

NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];

CustomLeafletVideoTableViewCell *selectedCell = (CustomLeafletVideoTableViewCell*)[self.tableView cellForRowAtIndexPath:indexPath];

NSString *cellTitle = selectedCell.customCellLabel.text;

NSLog(@"The text is %@", cellTitle);

NSManagedObjectContext *context = [self managedObjectContext];

NSString *key = [NSString stringWithFormat:@"%@_%ld_%ld", self.selectedLanguage, (long)indexPath.section, (long)indexPath.row];
if (self.favoritesDict[key] == nil)

    self.favoritesDict[key] = @(1);
    Favourites *favourites = [NSEntityDescription insertNewObjectForEntityForName:@"Favourites" inManagedObjectContext:context];
    favourites.title = cellTitle;


else


    [self.favoritesDict removeObjectForKey:key];
    NSError *error;

    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    request.entity = [NSEntityDescription entityForName:@"Favourites" inManagedObjectContext: context];
    request.predicate = [NSPredicate predicateWithFormat:@"title == %@", cellTitle];
    NSArray *items = [context executeFetchRequest:request error:&error];
    if (error == nil && items.count)
    
        NSManagedObject *managedObject = items[0];
        [context deleteObject:managedObject];

    


[[NSUserDefaults standardUserDefaults] setObject:self.favoritesDict forKey:@"favoritesDict"];
NSError *error = nil;
if (![context save:&error])

    // Error


[cell hideUtilityButtonsAnimated:YES];

[self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];

我对将图像放在“语言”选项卡的“传单”部分不感兴趣 (section 0);我只想定位视频部分 (section 1)。使用上面的代码,section 1 中的正确单元格正在应用 UIImageView,但我想确保第一部分(传单)也没有得到星号。

对此的任何指导将不胜感激。

【问题讨论】:

当有人喜欢某样东西时,我很难理解你在做什么。看起来你正在向 NSUserDefaults 添加一个字典,但你也得到了一个托管对象,但你没有对它做任何事情。是否有与视频同名的传单?如果是这样,您应该想出一种更好的方法来构建数据。 感谢@beyowulf - 传单和视频有不同的标题。我有字典,这样我就可以跟踪最喜欢的行/哪个部分,所以如果我喜欢传单部分中的某些内容,那么视频部分不应该是最喜欢的。 ManagedObjectContext 仅用于将收藏单元格的标题添加到 Core Data。所以这里的问题是,在 cellForRow 中,我让它检查是否有收藏夹,如果有,是哪一行/哪一部分。 问题是,当我从“视频”选项卡中收藏视频时,我只希望“语言”中的“视频”部分有收藏,而不是传单。与收藏项目相关的所有内容都在应用程序中运行;这只是这一部分,我想我需要对存储部分等的 NSDictionary 做一些事情。 在“视频”选项卡中,视频位于哪个部分? 【参考方案1】:

在你将单元格出列之后说customCell.customCellImage.hidden = YES; 然后更改:

if ([customCell.customCellLabel.text isEqualToString:favourite.title])
        

            customCell.customCellImage.hidden = NO;
        

收件人:

if ([customCell.customCellLabel.text isEqualToString:favourite.title] && indexPath.section == 1)
        

            customCell.customCellImage.hidden = NO;
        

【讨论】:

谢谢@beyowulf - 这真的很有帮助,而且很有意义。我刚刚更新了这个问题,因为我意识到我从问题中省略的 cellForRow 的大块是这里的关键部分。我明白为什么现在第 0 部分也受到关注。我在 NSManagedObject 之前更新问题的代码与用户可以选择在“语言”选项卡中为传单(第 0 节)或视频(第 1 节)加注星标这一事实有关,或者他们可能只喜欢来自的视频视频标签,所以我不知道如何解决这个问题。 经过大量测试和调试,这确实有效。我正在做一些过于复杂的事情。非常感谢您对此@beyowulf 的帮助。【参考方案2】:

tableView:cellForRowAtIndexPath: 中,您有关键部分,即indexPath。将以下条件添加到您的 if 语句中。

indexPath.section == 1

【讨论】:

谢谢@Avi - 这是有道理的,我已经更新了问题以包括为什么我认为这仍然失败的领域。

以上是关于仅将 UIImageView 应用于 UITableView 中的特定部分的主要内容,如果未能解决你的问题,请参考以下文章

仅将 IBAction 应用于单个单元格

CSS:仅将指针事件应用于文本

使 ESLint 仅将规则应用于某些文件名模式

NSFetchedResultsController 仅将 NSSortDescriptor 应用于满足特定条件的条目?

如何仅将 CSS 过渡应用于 transform 属性

如何仅将 CSS 样式应用于文本