2010-12-17 3 views
3

iPhoneでEventKitを操作しているときに、修正できないイベントがいくつか存在することに気付きました。これまでに遭遇した例は、CalDAVと同期された誕生日やイベントです。 iPhoneの標準のビルトインカレンダーアプリでイベントの詳細を表示すると、右上の「編集」ボタンは表示されず、「通常の」イベントを表示するときに表示されます。iPhone:EKEventインスタンスを変更できるかどうかを検出する方法は?

どこでも検索しましたが、そこにあるすべてのドキュメントを読んでいますが、この動作を検出する方法がわかりません。私は後でそれを検出することができます:それは編集できません変更されていない場合

  1. 編集イベント・ストア
  2. にそれセーブでイベントのタイトル
  3. は、イベントのタイトルをチェック!

私は、イベントの編集不可能な動作を事前に検出できる方法を探しています。私は他のカレンダーアプリがこれを正しく実装しているのを見て、これが可能であることを知っています。

答えて

8

これは、SDKが私にEKEventが読み取り専用かどうかを確認するために使用できる何も提供していないかのように見えます。私はすべてのEKEventインスタンスに "isReadOnly"メソッドを追加するカテゴリを作成して回避策を作成しました。

EKEvent + ReadOnlyCheck.h

@interface EKEvent(ReadOnlyCheck) 
- (BOOL) isReadOnly; 
@end` 

EKEvent + ReadOnlyCheck.m

#import "EKEvent+ReadOnlyCheck.h" 

@implementation EKEvent(ReadOnlyCheck) 

- (BOOL) isReadOnly { 
    BOOL readOnly; 
    NSString *originalTitle = [self.title retain]; 
    NSString *someRandomTitle = [NSString stringWithFormat:@"%i", arc4random()]; 

    self.title = someRandomTitle; 
    readOnly = [originalTitle isEqualToString:self.title]; 
    self.title = originalTitle; 
    [originalTitle release]; 

    return readOnly; 
} 
@end 

上記のファイルが所定の位置にあるとき、私は単に私の選択のEKEventにisReadOnlyを呼び出すことができます。

#import "EKEvent+ReadOnlyCheck.h" 
... 
if ([event isReadOnly]) { 
    // Do your thing 
} 
... 
+0

私もドキュメントを見てきましたが、これが唯一の解決策であるようです。 :-( –

+1

年後、まだ問題があります。iOS 6では(Exchangeカレンダーを使用して)タイトルを設定することは機能していないように見えます(日付は変更されません)。 –

7

私はイベントキットではまだ作業していませんが、ドキュメントからは編集可能性がイベントではなくカレンダーのプロパティだと思われます。 event.calendarはイベントのカレンダーを取得し、calendar.allowsContentModificationsはカレンダーが読み取り専用か読み書き可能かを示します。

+2

ありがとうございます。私はすでにカレンダーのそのプロパティを見てきましたが、それは誕生日にのみ機能します。また、カレンダーの1つのイベントは編集可能で、別のイベントは編集できない可能性があるため、これをカレンダーレベルで判断することはできません。イベントが電話機に同期されている場合は、読み取り専用ですが、同じ予定表に新しいイベントをローカルに追加すると編集可能になります。 –

1

tryを表示する前にEKEventViewControllerのallowsEditingプロパティを試してください。

1

はい。可能です。私はEKEventハンドルのために、このカテゴリのメソッドを追加することだと思う 私が編集可能/編集不可のイベントで使用するオブジェクトの出力をロギングすることで、コードに関連してみて、あなたが作業を理解する:)

EKEventViewController *controller = [[EKEventViewController alloc] init]; 
controller.event = myEvent; /*myEvent is of type EKEvent*/   
if(controller.navigationItem.leftBarButtonItem != NULL) 
{ 
    /*Event is Editable, Your code here*/ 
} 
0

:コードは、次のようになります。予定が編集できないすべてのケース:

- (BOOL)isReadOnly { 
    if (self.calendar.allowsContentModifications == NO) return YES; 
    if (self.organizer && [self.organizer isCurrentUser] == NO) return YES; 
    return NO; 
} 
関連する問題