質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

0回答

953閲覧

カレンダーに新規の予定を登録できない

退会済みユーザー

退会済みユーザー

総合スコア0

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2020/05/23 06:28

編集2022/01/12 10:55

前提・実現したいこと

SwiftでMacOSのアプリを作っています。
カレンダーに予定を追加する画面で、追加ボタンを押して下記の関数を呼び出すと「unrecognized selector sent to instance」というエラーが出てしまいます。

Xcodeの画面に赤や黄色の注意は出ませんが、eventStore.saveが実行できておらず予定が追加されません。
どうすれば追加できますか?

発生している問題・エラーメッセージ

2020-05-23 15:20:18.185217+0900 Waslendar[16782:1272116] -[EKEventStore saveEvent:span:error:]: unrecognized selector sent to instance 0x600002151040 2020-05-23 15:20:18.185632+0900 Waslendar[16782:1272116] [General] -[EKEventStore saveEvent:span:error:]: unrecognized selector sent to instance 0x600002151040 2020-05-23 15:20:18.187456+0900 Waslendar[16782:1272116] [General] ( 0 CoreFoundation 0x00007fff4dc1ba7d __exceptionPreprocess + 256 1 libobjc.A.dylib 0x00007fff78311a17 objc_exception_throw + 48 2 CoreFoundation 0x00007fff4dc95886 -[NSObject(NSObject) __retain_OA] + 0 3 CoreFoundation 0x00007fff4dbbd8ef ___forwarding___ + 1485 4 CoreFoundation 0x00007fff4dbbd298 _CF_forwarding_prep_0 + 120 5 Waslendar 0x00000001000165e8 $s9Waslendar17AddViewControllerC9saveEventyyF + 9048 6 Waslendar 0x0000000100010d8a $s9Waslendar17AddViewControllerC9addButtonyySo8NSButtonCF + 58 7 Waslendar 0x0000000100010dd4 $s9Waslendar17AddViewControllerC9addButtonyySo8NSButtonCFTo + 68 8 AppKit 0x00007fff4b44d644 -[NSApplication(NSResponder) sendAction:to:from:] + 312 9 AppKit 0x00007fff4b4b7992 -[NSControl sendAction:to:] + 86 10 AppKit 0x00007fff4b4b78c4 __26-[NSCell _sendActionFrom:]_block_invoke + 136 11 AppKit 0x00007fff4b4b77c6 -[NSCell _sendActionFrom:] + 178 12 AppKit 0x00007fff4b4e454b -[NSButtonCell _sendActionFrom:] + 96 13 AppKit 0x00007fff4b4b60e1 -[NSCell trackMouse:inRect:ofView:untilMouseUp:] + 2375 14 AppKit 0x00007fff4b4e429c -[NSButtonCell trackMouse:inRect:ofView:untilMouseUp:] + 698 15 AppKit 0x00007fff4b4b4b1e -[NSControl mouseDown:] + 791 16 AppKit 0x00007fff4b390937 -[NSWindow(NSEventRouting) _handleMouseDownEvent:isDelayedEvent:] + 5724 17 AppKit 0x00007fff4b2c71a6 -[NSWindow(NSEventRouting) _reallySendEvent:isDelayedEvent:] + 2295 18 AppKit 0x00007fff4b2c6667 -[NSWindow(NSEventRouting) sendEvent:] + 478 19 AppKit 0x00007fff4b165e4b -[NSApplication(NSEvent) sendEvent:] + 331 20 AppKit 0x00007fff4b1545c0 -[NSApplication run] + 755 21 AppKit 0x00007fff4b143ac8 NSApplicationMain + 777 22 Waslendar 0x0000000100024e9d main + 13 23 libdyld.dylib 0x00007fff79adf3d5 start + 1 24 ??? 0x0000000000000003 0x0 + 3 )

該当のソースコード

Swift

1import Cocoa 2import EventKit 3 4class AddViewController: NSViewController { 5 6 let eventStore:EKEventStore = EKEventStore() 7 var buttons: [NSButton]! 8 9 @IBOutlet weak var startPicker: NSDatePicker! 10 @IBOutlet weak var titleField: NSTextField! 11 @IBOutlet weak var endPicker: NSDatePicker! 12 @IBOutlet weak var datePicker: NSDatePicker! 13 @IBOutlet weak var nonRepeat: NSButton! 14 @IBOutlet weak var everyDay: NSButton! 15 @IBOutlet weak var everyWeek: NSButton! 16 @IBOutlet weak var everyMonth: NSButton! 17 @IBOutlet weak var allDay: NSButton! 18 19 @IBAction func radioButton(_ sender: NSButton) {} 20 21 @IBAction func addButton(_ sender: NSButton) { 22 saveEvent() 23 } 24 25 override func viewDidLoad() { 26 super.viewDidLoad() 27 // Do view setup here. 28 if EKEventStore.authorizationStatus(for: .event) == .notDetermined{ 29 eventStore.requestAccess(to: .event, completion: { (granted, error) in 30 if granted && error == nil { 31 print("granted") 32 } 33 else{ 34 print("not granted") 35 } 36 }) 37 } 38 buttons = [nonRepeat,everyDay,everyWeek,everyMonth] 39 datePicker.locale = Locale.current 40 datePicker.dateValue = Date() 41 42 var component = NSCalendar.current.dateComponents([.year, .month, .day, .hour], from: Date()) 43 component.hour = component.hour! + 1 44 component.minute = 0 45 component.second = 0 46 let startDate = NSCalendar.current.date(from:component)! as Date 47 component.hour = component.hour! + 1 48 let endDate = NSCalendar.current.date(from:component)! as Date 49 50 startPicker.dateValue = startDate 51 endPicker.dateValue = endDate 52 } 53 54 func saveEvent() { 55 if EKEventStore.authorizationStatus(for: .event) == .authorized{ 56 let event = EKEvent(eventStore: eventStore) 57 event.title = titleField.stringValue 58 var dateC = NSCalendar.current.dateComponents([.year, .month, .day], from: datePicker.dateValue) 59 let startC = NSCalendar.current.dateComponents([.hour, .minute], from: startPicker.dateValue) 60 let endC = NSCalendar.current.dateComponents([.hour, .minute], from: endPicker.dateValue) 61 dateC.second = 0 62 dateC.hour = startC.hour 63 dateC.minute = startC.minute 64 let startDate = NSCalendar.current.date(from:dateC)! as Date 65 dateC.hour = endC.hour 66 dateC.minute = endC.minute 67 let endDate = NSCalendar.current.date(from:dateC)! as Date 68 69 event.startDate = startDate 70 event.endDate = endDate 71 event.isAllDay = allDay.state == .on 72 event.calendar = eventStore.defaultCalendarForNewEvents 73 74 var selected = 0 75 for button in buttons { 76 if button.state == .on { 77 selected = buttons.firstIndex(of: button)! 78 } 79 } 80 81 switch selected { 82 case 0: 83 break 84 case 1: 85 let recurrenceRule = EKRecurrenceRule.init(recurrenceWith: .daily,interval: 1,end: nil) 86 event.recurrenceRules = [recurrenceRule] 87 break 88 case 2: 89 let recurrenceRule = EKRecurrenceRule.init(recurrenceWith: .weekly,interval: 1,end: nil) 90 event.recurrenceRules = [recurrenceRule] 91 break 92 case 3: 93 let recurrenceRule = EKRecurrenceRule.init(recurrenceWith: .monthly,interval: 1,end: nil) 94 event.recurrenceRules = [recurrenceRule] 95 break 96 default: 97 break 98 } 99 100 do { 101 print("予定を追加します") 102 //windowを閉じる 103 self.view.window?.performClose(nil) 104 try eventStore.save(event, span: .thisEvent) 105 print("予定を追加しました") 106 } 107 catch { 108 print("Save is failed.") 109 } 110 } 111 else{ 112 let alert = NSAlert() 113 alert.messageText = "追加できません" 114 alert.informativeText = "カレンダーのアクセスを許可してください" 115 alert.runModal() 116 } 117 } 118}

同じエラーが出る簡略化したコード

Swift

1import Cocoa 2import EventKit 3 4class ViewController: NSViewController { 5 6 let eventStore:EKEventStore = EKEventStore() 7 8 override func viewDidLoad() { 9 super.viewDidLoad() 10 11 let status = EKEventStore.authorizationStatus(for: EKEntityType.event) 12 if status == .authorized { 13 print("アクセスできます!!") 14 }else if status == .notDetermined { 15 eventStore.requestAccess(to: EKEntityType.event) { (granted, error) in 16 if granted { 17 print("アクセス可能になりました。") 18 }else { 19 print("アクセスが拒否されました。") 20 } 21 } 22 } 23 saveEvent() 24 } 25 26 func saveEvent() { 27 if EKEventStore.authorizationStatus(for: .event) == .authorized{ 28 29 let event = EKEvent(eventStore: eventStore) 30 event.title = "sample" 31 event.startDate = Date() 32 event.endDate = Date().addingTimeInterval(2 * 60 * 60) 33 event.isAllDay = false 34 event.calendar = self.eventStore.defaultCalendarForNewEvents 35 do { 36 try eventStore.save(event, span: .thisEvent) 37 } 38 catch { 39 print("Save is failed.") 40 } 41 } 42 } 43 44} 45

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

MacOS Mojave 10.14.6
Xcode 11.3.1
Swift 5

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2020/05/24 18:26

それで良さそうに見えますけど、eventStore の定義はどうなってますか?
退会済みユーザー

退会済みユーザー

2020/05/24 23:48

返信ありがとうございます。質問のコードを書き足しました。
hoshi-takanori

2020/05/25 01:29

そのソースを簡略化して動かしてみましたけど、追加できましたよ。 App Sandbox は設定してますか? unrecognized selector ってのが不吉な感じですよね…。
退会済みユーザー

退会済みユーザー

2020/05/25 01:51

新しいサンプルアプリを作成し、 ・SandboxとHardened Runtimeの、Calendarにチェック ・info.plistにPrivacy - Calendars Usage Descriptionを追加 ・eventStore.requestAccessと、saveEvent()を追加 とやってみたのですが同じエラーが出ました…。 エラーに[EKEventStore saveEvent:span:error:]:と書いてあるので、spanの「.thisEvent」がいけないのでしょうか?
退会済みユーザー

退会済みユーザー

2020/05/25 01:59

あと、ログに「予定を追加します」とprintされた後エラーが出力され「予定を追加しました」が来ないので、そこで動作が止まってしまっているようです。
hoshi-takanori

2020/05/25 02:09

うーん、こちらでは try eventStore.save(event, span: .thisEvent) のままで動いたので、それで大丈夫だと思うのですが…。 (ちなみに、macOS Catalina 10.15.4 + Xcode 11.5 です。) > 「予定を追加しました」が来ない save でクラッシュすれば次の行は実行されないのでそうなります。
退会済みユーザー

退会済みユーザー

2020/05/25 05:15

iOSで試してみたら、ちゃんとカレンダーに登録されていました。なんでMacだとダメなんでしょうか…。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問