0

プロトコルで宣言されたセルのタイトルと説明を提供する 2 つのメソッドがあります。

@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

これを試して :

2つのプロパティを宣言し、それらのgetterメソッドを定義する代わりに、Stringを返す2つのメソッドを定義できます。そして、これを使用して、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"];

if(cell == nil){

        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 に答える