0

配列コントローラー (すべてのバインディング) を介して Tableview に表示される一連の属性があり、他のコンテンツに基づいて属性の 1 つを変更するコードをいくつか書きました。Core データがこのエンティティ用に作成した .m ファイルに次のように記述しました。

ヘッダ:

#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>

@class Instrument;

@interface IO : NSManagedObject

@property (nonatomic, retain) NSNumber * channel;
@property (nonatomic, retain) NSString * depiction;
@property (nonatomic, retain) NSString * prefix;
@property (nonatomic, retain) NSNumber * rack;
@property (nonatomic, retain) NSNumber * slot;
@property (nonatomic, retain) NSString * suffix;
@property (nonatomic, retain) NSString * tag;
@property (nonatomic, retain) NSString * type;
@property (nonatomic, retain) NSString * depictionFull;
@property (nonatomic, retain) Instrument *io_instrument;

@end

主要:

#import "IO.h"
#import "Instrument.h"
#import "Loop.h"
#import "Area.h"


@implementation IO {
}

@dynamic channel;
@dynamic depiction;
@dynamic prefix;
@dynamic rack;
@dynamic slot;
@dynamic suffix;
@dynamic tag;
@dynamic type;
@dynamic depictionFull;
@dynamic io_instrument;

- (void)awakeFromFetch{

    [self setDepictionFull:[NSString stringWithFormat:@"%@ %@ %@ %@", self.io_instrument.instrument_loop.loop_area.name, self.io_instrument.instrument_loop.depiction, self.io_instrument.depiction, self.depiction]];
}

@end

ここには 2 つの問題があります。

  1. これは、属性のテーブル「ビュー」値のみを変更し、実際に保存された値は変更しません (コードをコメントアウトすると値が保存されないため、これはわかっています)

  2. 私が使用する「awakeFromFetch」関数は、データをフェッチするときにのみコードを適用しますが、エンティティ (または配列コントローラー) の属性を変更したときにも更新したいと考えています。

4

1 に答える 1

0

これを行う最善の方法は、値を保存するのではdepictionFullなく、要求されたときに返すことです。

- (NSString *)dipictionFull {
    return [NSString stringWithFormat:@"%@ %@ %@ %@", self.io_instrument.instrument_loop.loop_area.name, self.io_instrument.instrument_loop.depiction, self.io_instrument.depiction, self.depiction];
}

このようにして、常に最新の値が返されます。それは怠惰な方法で動作しており、iOS と Objective-C はうまく機能する傾向があります。属性またはプロパティが他のプロパティまたは属性に完全に依存している場合、これは [一般的に] 悪い考えではありません。

保存しない限り、明示的に保存していないため、値が正しく表示され、保存されていないと思います。

最後に、このコードを実際の NSManagedObject サブクラスに入れるべきではありません。属性を追加して、このクラスを再作成する必要がある場合はどうすればよいでしょうか? 次に (XCodes 作成ツールを使用している場合)、カスタム を完全に消去しますawakeFromFetch。代わりにcategoryforを作成しIO、そこにカスタム コードを配置します。その後、実装を再作成する必要がある場合NSManagedObject、カテゴリは変更されません。

更新 - カテゴリの使用方法

カテゴリを作成するには、ファイル->新規->ファイル(またはコマンド + N) に移動し、Cocoa TouchでObjective-C カテゴリを選択します。カテゴリにAddOn (またはそのようなもの) という名前を付け、Categoryの下に NSManagedObject のサブクラス (この場合はInstrument) を配置します。それが作成された後、メソッド-(NSString *)dipictionFull;を に配置.hし、上記の実装を に配置し.mます。Instrument+AddOn.h次に、このメソッドを使用するときに、必要なクラスでインポートしますdipictionFull。次に、単にそれを呼び出すだけで[self.myInstrument dipictionFull]、値を毎回ライブでプルしているため、常に最新の文字列を取得できます。

于 2013-06-21T13:07:21.920 に答える