2

クラスのサブクラス化に少し苦労していEKEventます。シナリオは次のとおりです。Web サービスを使用して外部データベースからすべてのイベントを取得しているため、すべてのイベントに ID が付いています。次に、これらのイベントをデバイスのカレンダーに入れ、後で取得したいと考えています。問題は、イベントを取得するときに、サーバー上のイベントと同じ ID を持つ必要があるため、簡単に検索してイベントに関する追加情報を取得できることです。

identifierのプロパティが読み取り専用であることを認識しているEKEventため、クラスのサブクラスを作成して、次のようなものと呼ばれる追加のプロパティを追加しmyid、イベントの ID (サーバーからのもの) を保存することができます。イベントストア。サブクラスを作成しようとしましたが、すべてが正常に動作し、コンパイルされているようですが、実行時に、サブクラスに追加する追加の eventid プロポーティを設定しようとするとエラーが発生します。エラー メッセージは次のとおりです。

 Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[EKEvent setEventId:]: unrecognized selector sent to instance 0x83c0770'

EKEventこれは、サブクラスからイベントを作成するために使用するテスト コードです。

 SectureEvent *myEvent  = (SectureEvent*)[EKEvent eventWithEventStore:eventDB];
 myEvent.title     = self.evento;
 myEvent.startDate = [[NSDate alloc] init];
 myEvent.startDate = [NSDate date];
 myEvent.endDate   = [[NSDate alloc] init];
 myEvent.endDate   = [[NSDate alloc] init];
 myEvent.allDay = YES;
 myEvent.eventId = self.eventId;

最後の行でエラーが発生し、myEvent.eventId = self.eventId; アプリがクラッシュします。したがって、クラスを効果的にサブクラス化できるかどうか、本質的に私の質問ですEKEvent。そうであれば、ここで何が間違っていますか?

前もって感謝します!

4

2 に答える 2

16

EKEventサブクラス化するためのものではありません。イベント キット オブジェクトは、データベース レコードを表すために使用されます。のサブクラスを作成してEKEventも、イベント キット データベースに新しいフィールドが魔法のように挿入されることはなく、を別のEKEventものにキャストしても、そのオブジェクトのクラスが魔法のように変更されることはありません。

追加のフィールドをデータベースに保存する唯一の方法は、そのデータベースに直接アクセスすることです。これは Apple が独自に予約しています。

Event Kit データベースに新しいフィールドを追加することはできないため、既存のフィールドを使用する (たとえば、イベントのメモにイベント ID を追加する) か、アプリケーションによって管理される 2 番目のデータベースでフィールドを拡張することができます。

EKEventイベント ID を識別子に関連付ける SQLite データベース (またはプロパティ リスト ファイル、または任意の形式) を作成するだけです。

于 2012-07-09T19:40:27.550 に答える
2

EKEvent を作成して SectureEvent としてキャストすることは、SectureEvent を作成することと同じではありません。

これを試して:

SectureEvent *myEvent = [SectureEvent eventWithEventStore:eventDB];

于 2012-07-09T19:20:43.077 に答える