0

我有这两种方法为单元格提供标题和描述,在协议中声明。

@protocol TableCellProtocol <NSObject>

@optional
@property(readonly,nonatomic,strong) NSString *titleForCell;
@property(readonly,nonatomic,strong) NSString *descriptionForCell;

@end

我有一个 NSManagedObject 实现该协议并提供相关方法:

-(NSString*)titleForCell {
   return [NSString stringWithFormat:@"%@ - %@",self.myVar1,self.myVar2];
}

-(NSString*)descriptionForCell {
  return [NSString stringWithFormat:@"%@ - %@",self.myVar3,self.myVar4];
}

self.myVar<n>CoreData 属性在哪里。

此协议旨在用于 UITableViewCell:

- (UITableViewCell *)tableView:(UITableView *)table cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    id<TableCellProtocol> obj = [_fetchedResultsController objectAtIndexPath:indexPath];
    MyTableViewCell *cell = [table dequeueReusableCellWithIdentifier:@"tableCell"];
    cell.cellTitle.text=obj.titleForCell;
    cell.cellDescr.text=obj.descriptionForCell;

    return cell;
}

虽然我没有内存泄漏或分配问题,但我发现这并不是很优雅,而且由于性能原因很差,因为每次显示单元格时都会创建一个新的 NSString。

此外,相关属性可能会在应用程序生命周期中发生变化,因此如果在某处存储标题和描述,我需要在需要时刷新它们。

我在我的项目中使用 ARC。

4

3 回答 3

0

试试这个 :

您可以定义两个返回 String 的方法,而不是声明两个属性并定义它们的 getter 方法。并使用它为您的 tableViewCell 设置标题和描述。

@protocol TableCellProtocol <NSObject>

@optional
-(NSString *) getTitleForCell;
-(NSString *) getDescriptionForCell;

@end




-(NSString*)getTitleForCell {
   return [NSString stringWithFormat:@"%@ - %@",self.myVar1,self.myVar2];
}

-(NSString*)getDescriptionForCell {
  return [NSString stringWithFormat:@"%@ - %@",self.myVar3,self.myVar4];
}

让我知道这是否适合你。谢谢。

于 2013-01-19T11:20:21.577 回答
0

您必须通过检查 if(cell==nil) 来重用表格视图中的单元格

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

{

id<TableCellProtocol> obj = [_fetchedResultsController objectAtIndexPath:indexPath];
MyTableViewCell *cell = [table dequeueReusableCellWithIdentifier:@"tableCell"];

如果(细胞 == 零){

        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"cell"];
    }
cell.cellTitle.text=obj.titleForCell;
cell.cellDescr.text=obj.descriptionForCell;

return cell;

}

于 2013-01-19T11:22:44.287 回答
0

关于您上面的评论,我将发布使用瞬态属性将自定义属性存储在 NSManagedObject 子类中。这种方法在内存方面非常有效,因为托管对象上下文会保留对象,直到上下文被重置,并且如果发生某些更改,它会自动相应地更改属性。在您的情况下,您必须在每次创建或重用单元格时创建字符串。但是,现在由于我们缓存了对象,一旦创建了瞬态属性,它就一直存在,并且没有任何内存开销。所以它应该快得多。

您可以按如下方式实现瞬态属性:

@implementation SomeManagedObject

   + (NSSet*)keyPathsForValuesAffectingValueForKey:(NSString *)key{
     if([key isEqualToString:@"cellTitle"]){
      return [NSSet setWithObjects:@"myVar1", @"myVar2", nil];
    }else if([key isEqualToString: @"cellDescription"]){
      return [NSSet setWithObjects:@"myVar3", @"myVar4", nil];
    }
     return [super keyPathsForValuesAffectingValueForKey:key];
   } 

  // You could either override the getter for the transient attribute like this

  - (NSString*)cellTitle{
   if(!_cellTitle){
    [sell willChangeValueForKey: @"cellTitle"]; 
     _cellTitle =  [NSString stringWithFormat:@"%@ - %@",self.myVar1,self.myVar2];
    [self didChangeValueForKey: @"cellTitle"];
   }
   return _cellTitle;
  }

  // You could also override the awakeFromFetch method to create the transient attribute as

 - (void)awakeFromFetch{
    [sell willChangeValueForKey: @"cellTitle"]; 
     _cellTitle =  [NSString stringWithFormat:@"%@ - %@",self.myVar1,self.myVar2];
    [self didChangeValueForKey: @"cellTitle"];  
    [super awakeFromFetch];
}

 // Also use the willTurnIntoFault/didTurnIntoFault method as

 - (void)didTurnIntoFault{
     [super didTurnIntoFault];
     [sell willChangeValueForKey: @"cellTitle"]; 
     _cellTitle =  [NSString stringWithFormat:@"%@ - %@",self.myVar1,self.myVar2];
    [self didChangeValueForKey: @"cellTitle"];  
 }

@end

我希望这会有所帮助。谢谢

于 2014-01-14T17:46:25.983 回答