【问题标题】:Change background colour of Cell更改单元格的背景颜色
【发布时间】:2015-05-01 11:26:19
【问题描述】:

如果插入了新项目,是否可以更改表格单元格的背景颜色。我可以更改所有单元格的背景颜色,但我只是新添加的一个来更改颜色。

有什么办法可以做到吗?

- (void)insertNewObject:(OutgoingHolder*)expense {
    NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext];
    NSEntityDescription *entity = [[self.fetchedResultsController fetchRequest] entity];
    Outgoing *outgoing = [NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context];

    // If appropriate, configure the new managed object.
    // Normally you should use accessor methods, but using KVC here avoids the need to add a custom class to the template.
    //[newManagedObject setValue:[NSDate date] forKey:@"timeStamp"];

    // Save the context.

    outgoing.costDescription = expense.costDescription;
    outgoing.amount = [NSNumber numberWithFloat:expense.amount];
    outgoing.date = expense.date;
    outgoing.category = expense.category;


    NSError *error = nil;
    if (![context save:&error]) {
        // Replace this implementation with code to handle the error appropriately.
        // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }

    //CHANGES HERE
    self.addedNewRow=0;
    [self.tableView reloadData];
}





#pragma mark - Table View

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return [[self.fetchedResultsController sections] count];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    id <NSFetchedResultsSectionInfo> sectionInfo = [self.fetchedResultsController sections][section];
    return [sectionInfo numberOfObjects];
}

-(NSString*) tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{

    id <NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsController sections] objectAtIndex:section];

    return[sectionInfo name];


}

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
    [self configureCell:cell atIndexPath:indexPath];

    if (_total > 0.0 ) {
        //UPDATE 1:
        NSLog(@"%@",[@"Total : " stringByAppendingString:[NSString stringWithFormat:@"%.2f", self.total]]);
        id <NSFetchedResultsSectionInfo> sectionInfo = [self.fetchedResultsController sections][indexPath.section];
        if ([sectionInfo numberOfObjects]-1  == indexPath.row  && self.addedNewRow!=-1) {
            cell.contentView.backgroundColor = [UIColor orangeColor];
            [cell.textLabel setBackgroundColor:[UIColor clearColor]];
        }
    }


    return cell;
}

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
    // Return NO if you do not want the specified item to be editable.
    return YES;
}

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext];
        [context deleteObject:[self.fetchedResultsController objectAtIndexPath:indexPath]];

        NSError *error = nil;
        if (![context save:&error]) {
            // Replace this implementation with code to handle the error appropriately.
            // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
            abort();
        }
    }
}

- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath {
    Outgoing *outgoing = [self.fetchedResultsController objectAtIndexPath:indexPath];
    cell.textLabel.text = outgoing.costDescription;
    cell.detailTextLabel.text = [NSString stringWithFormat:@"%.2f",[outgoing.amount floatValue]];

}

【问题讨论】:

  • 有什么你试过的,可以给我们看看吗?
  • 您可以更改每个单元格的背景颜色,您不仅限于all
  • 贴出你尝试过的代码
  • 如何添加新单元格?你也可以发布那个代码吗?
  • @ViralSavaj 请查看已编辑的代码问题

标签: ios objective-c xcode


【解决方案1】:

你可以通过以下方式获取新添加的单元格,前提是新单元格始终添加在最后一个位置。

只需在 .h 文件中定义标志变量,例如

@property (nonatomic, assign) int addedNewRow;

现在在您的.m 文件中初始化addedNewRow-1 之类的,

- (void)viewDidLoad {
    [super viewDidLoad];
    self.addedNewRow=-1;
    //other stuff
}

替换下面两个对您的代码有一点增强的方法,

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
    [self configureCell:cell atIndexPath:indexPath];

    //UPDATE 1:
    id <NSFetchedResultsSectionInfo> sectionInfo = [self.fetchedResultsController sections][indexPath.section];
    if ([sectionInfo numberOfObjects]-1  == indexPath.row  && self.addedNewRow!=-1) {
        cell.contentView.backgroundColor = [UIColor orangeColor];
        [cell.textLabel setBackgroundColor:[UIColor clearColor]];
    }

    return cell;
}

- (IBAction)insertNewElement:(UIBarButtonItem *)sender
{
    NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext];
    NSEntityDescription *entity = [[self.fetchedResultsController fetchRequest] entity];
    Outgoing *outgoing = [NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context];

    // If appropriate, configure the new managed object.
    // Normally you should use accessor methods, but using KVC here avoids the need to add a custom class to the template.
    //[newManagedObject setValue:[NSDate date] forKey:@"timeStamp"];

    // Save the context.

    outgoing.costDescription = expense.costDescription;
    outgoing.amount = [NSNumber numberWithFloat:expense.amount];
    outgoing.date = expense.date;
    outgoing.category = expense.category;


    NSError *error = nil;
    if (![context save:&error]) {
        // Replace this implementation with code to handle the error appropriately.
        // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }

    //CHANGES HERE
    self.addedNewRow=0;
    [self.tableView reloadData];
}

希望对你有帮助!!

【讨论】:

  • 我收到关于 id sectionInfo = [self.fetchedResultsController section][section] 的错误;在 [部分]
  • @John,很好 'UPDATE 1:' 从已编辑的答案更新并替换下一行
  • 这仍然突出显示所有单元格。当应用程序加载时,背景颜色不会出现,但是当我添加一个新项目时,所有单元格都会突出显示
  • 我还有一个 if 语句来检查一个值是否大于另一个值。如果该值更大,那么我是否希望突出显示新单元格。其余的将保持不变。
  • 我想要做的只是在我拥有的总数大于 0 时突出显示添加的新单元格。如果我添加一个新单元格,如果值仍然更大,则新突出显示的单元格应该保持突出显示.但是如果该值不大于则背景将是默认的
【解决方案2】:

试试这个,

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (indexPath.row % 2 == 0)
    {
        cell.backgroundColor =[UIColor blueColor];
    } else {
        cell.backgroundColor =[UIColor redColor];
    }
}

【讨论】:

  • 你确定这会工作,只有新添加的单元格?
【解决方案3】:

存储新插入的indexPath,并在willDisplayingCell:forRowAtIndexPath:委托方法中检查该indexPath,并更改单元格的contentView的背景颜色。

【讨论】:

    【解决方案4】:

    使用tableView: willDisplayCell:方法改变颜色

    - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
        if (...){ //do your stuff.
            [cell.backView setBckgroundColor:[UIColor redColor];
        } else {
            [cell.backView setBckgroundColor:[UIColor whiteColor];
        }
    }
    

    change the background color of customize tableViewCell

    【讨论】:

      【解决方案5】:
      - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
      {
          cell.backgroundColor = [UIColor whiteColor];
      
          if (indexPath.row == dataArray.count-1)
          {
              [cell setBackgroundColor:[UIColor colorWithRed:123/255.0 green:234.0/255.0 blue:255/225.0 alpha:1.0]];
          }
      }
      

      【讨论】:

        【解决方案6】:

        更新答案:

        numberOfRowsInSection 方法:

        - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
        {
            return [dataArray count];
        }
        

        在 cellForRowAtIndexPath 方法内:

        if(indexPath.row == dataArray.count-1){
            cell.contentView.backgroundColor = [UIColor blueColor];
        }
        

        编辑 1:

        dataArray 是用于填充表格行的数组,用于检查数组中元素的总数以在numberOfRowsInSection 方法中加载到表格中。

        【讨论】:

        • dataArray 的用途是什么?
        • - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath]; [self configureCell:cell atIndexPath:indexPath]; if(indexPath.row == dataArray.count-1){ cell.contentView.backgroundColor = [UIColor blueColor]; } 返回单元格; }
        • dataArray 是用于馈送表格行的数组。
        • 我对表格视图相当陌生,我在 dataArray 上收到一个错误,我不完全确定我的数组是什么。它会在哪里声明?
        • 问题已更新!最好发布有问题的代码。
        【解决方案7】:

        您可以在cellForRowAtIndexPath 中为新添加的单元格应用验证。

        在.h文件中声明一个变量。

        Outgoing *lastOutgoing;
        

        作为viewDidLoad 方法中的初始lastOutgoing = nil。一旦添加了新对象。在lastOutgoing 中保留该对象的引用。这里是insertNewObject修改的方法。

        - (void)insertNewObject:(OutgoingHolder*)expense {
            NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext];
            NSEntityDescription *entity = [[self.fetchedResultsController fetchRequest] entity];
            Outgoing *outgoing = [NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context];
        
            // If appropriate, configure the new managed object.
            // Normally you should use accessor methods, but using KVC here avoids the need to add a custom class to the template.
            //[newManagedObject setValue:[NSDate date] forKey:@"timeStamp"];
        
            // Save the context.
        
            outgoing.costDescription = expense.costDescription;
            outgoing.amount = [NSNumber numberWithFloat:expense.amount];
            outgoing.date = expense.date;
            outgoing.category = expense.category;
        
        
            NSError *error = nil;
            if (![context save:&error]) {
                // Replace this implementation with code to handle the error appropriately.
                // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
                NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
                abort();
            }
        
          lastOutgoing = outgoing;
          [self.tableView reloadData];
        }
        

        在configureCell方法中

        - (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath {
            Outgoing *outgoing = [self.fetchedResultsController objectAtIndexPath:indexPath];
            cell.textLabel.text = outgoing.costDescription;
            cell.detailTextLabel.text = [NSString stringWithFormat:@"%.2f",[outgoing.amount floatValue]];
        
           if([lastOutgoing isEqual:outgoing]){
              cell.backgroundColor = [UIColor orangeColor];
           }
        
        }
        

        希望对你有所帮助..

        【讨论】:

        • 最初,不添加新单元格,它会改变最后一个单元格的颜色。
        • @viral - 您不希望第一次加载表格时最后一个单元格颜色不同,仅在添加新单元格/行时更改颜色?
        • @the_UB,刚刚对初始数据加载应用了另一项验证。
        • @None 我无法找到输入该方法的数组。你的是dataArray,但我不知道我的是什么
        • @John,你不需要那个代码。刚刚删除。
        猜你喜欢
        • 1970-01-01
        • 2011-09-24
        • 2013-04-12
        • 2021-10-31
        • 2016-05-27
        • 1970-01-01
        • 2013-06-15
        • 2013-06-28
        • 2020-02-02
        相关资源
        最近更新 更多