2012-07-09 118 views
1

我一直在subclasslassing EKEvent類有點麻煩。場景是這樣的,我使用web服務從外部數據庫中提取所有事件,所有事件都帶有一個ID。然後我想將這些事件放入設備日曆中,稍後再檢索它們。問題是,當我檢索事件時,我需要它與服務器上的事件具有相同的ID,所以我可以快速查找以獲取事件的其他信息。正確地繼承EKEvent類

我知道的EKEventidentifier屬性爲只讀,所以我要創建的類的子類,我可以添加一個名爲東西一個附加屬性像myid和存儲事件ID的原因(一從服務器)與它在事件庫中。我試圖創建一個子類,一切似乎正常工作和編譯,但在運行時我得到一個錯誤,當我嘗試設置額外的事件ID proporty我在子類中添加,該錯誤信息是:

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; 和應用程序崩潰時出現錯誤。所以我的問題essentailly,如果我可以有效地繼承EKEvent類,如果是的話,我在這裏做錯了什麼?

在此先感謝!

回答

14

EKEvent並不意味着被繼承。 Event Kit對象用於表示數據庫記錄。創建EKEvent的子類不會在事件工具包數據庫中奇蹟般地插入新字段,也不會將EKEvent強制轉換爲別的東西,從而奇蹟般地更改該對象的類。

將額外字段存儲到數據庫中的唯一方法是直接訪問該數據庫,Apple爲自己保留該數據庫。

由於無法將新字段添加到Event Kit數據庫,因此您可以使用現有字段(例如,在事件的註釋中添加事件ID),也可以使用由應用程序管理的第二個數據庫對其進行擴展。

只需創建一個將您的事件ID與EKEvent標識符相關聯的SQLite數據庫(或屬性列表文件或任何您想要的格式)即可。

+0

這絕對是正確答案! – 2012-07-09 19:48:36

+0

好吧,我想我會用SQLite解決方案。感謝您的解釋! – Sparq 2012-07-09 19:57:58

+0

謝謝,應該清楚:) – 2015-11-05 08:51:21

2

創建EKEvent並將其轉換爲SectureEvent與創建SectureEvent不同。

試試這個:

SectureEvent *myEvent = [SectureEvent eventWithEventStore:eventDB];

+0

感謝您的工作,並避免了崩潰,但我有問題從事件存儲中檢索事件。當我使用謂詞從事件存儲中獲取事件並將它們放入數組中時,我是否有可能實現我想要做的事情,它們是EKEvent,它們缺少額外的ID屬性,您能否想到解決方法? – Sparq 2012-07-09 19:28:28

+0

擁有OO解決方案通常是可取的,但需要一些工作才能得到您想要的。我建議僅使用EKEvents和關聯數組(或根據預期事件數量的數據庫)將服務器中的ID與事件的ID進行配對。 – jtomschroeder 2012-07-09 19:42:21

+0

感謝您的快速響應和幫助!投票! – Sparq 2012-07-09 19:59:24