2

私は 2 つの非常によく似たモデル クラスを持つアプリに取り組んでいます。これらのクラスの両方を 1 つのビュー コントローラーで使用したいと考えています。このレイアウトは、モデル クラスのプロパティに基づいています。問題は、現在、どのクラスであるかを確認するための if ステートメントがたくさんあることです。

例:

- (UIView *)setUpViewForObject:(id)object
{

    // Check if it is a Post or Event object
    Post *post;
    Event *event;
    if ([object class] == [Event class]) {
        event = (id)object;
    } else if ([object class] == [Post class]) {
        post = (id)object;
    }

    if (post) {
        // Do stuff
        // ie:
        self.customUiView.textField.text = post.text;
    } else if (event) {
        // Do similar stuff
        // ie:
        self.customUiView.textField.text = event.text; 
    }
}  

このソリューションはかなり冗長に思えますが、私はいくつかの場所でそれを行っています。したがって、2 つの NSManagedObject クラスのラッパー クラスを作成することは可能でしょうか。私は CoreData を使用し、xCode からモデルを生成したので、これらすべての if ステートメントは使用しません。

何かのようなもの:

@interface News : NSManagedObject
[...]
@property (nonatomic, retain) NSString * text;
[...]

@interface Event : NSManagedObject
[...]
@property (nonatomic, retain) NSString * text;
[...]

おそらく列挙型を使用して、これら2つの NSManagedObject クラスのラッパークラスを作成することは可能ですか? また、オブジェクトを更新可能、削除可能にしたいと考えています。抽象クラスを作成するために Enum などを使用できるのではないかと考えていましたが、そのようなクラスがどのように見え、機能し、使用されるのかわかりません。

これが可能である場合の提案と、その場合、このようなラッパー クラスがどのように見えるかは大歓迎です。

4

2 に答える 2

1

Core Data は、抽象スーパークラスの概念をサポートしています。したがって、2 つのクラスを区別する 1 つのプロパティ、たとえば「タグ」で定義します。次に、ニュースとイベントの両方がそのクラスをスーパークラスとして持っています。これは、Core Data で使用される非常に一般的なタイプのソリューションです。

于 2012-08-04T13:39:08.877 に答える
1

このようにしてみてください:

//in NewsEventRootObject.h
@interface NewsEventRootObject:NSManagedObject //root object for these two classes

[...]

@property (nonatomic,retain) NSString *text; //similar fields in here

-(void) getSomeValue;

//in News.h
@interface News : NewsEventRootObject

[...]

-(void) getNews;

//in Event.h
@interface Event : NewsEventRootObject

[...]

-(void) getEvent;

//in your "handler".m

- (UIView *)setUpViewForObject:(NewsEventRootObject *) object
{ 
    //you can access similar fields and methods without if/else statements
    self.customUiView.textField.text = object.text;

    SomeValue *someValue=[object getSomeValue];

    //but for class-specific you should make a check
    if ([object respondsToSelector:@selector(getEvent)]) {

    }

    if ([object respondsToSelector:@selector(getNews)]) {

    }

}  

そして実際には、 == を介してクラスをチェックしないでください。 isKindOfClass ステートメントを使用してください

于 2012-08-04T13:39:28.507 に答える