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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Swift

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

Q&A

解決済

1回答

1512閲覧

swift 通知実装中のエラー

ssh_u

総合スコア34

Swift

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

0グッド

0クリップ

投稿2017/10/09 11:33

編集2017/10/11 13:58

###前提・実現したいこと
swiftでアプリ開発をしています
指定した時間に通知をしたいのですがエラーが発生して進みません

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

159行 Cannot convert value of type 'Date?' to expected argument type 'TimeInterval' (aka 'Double')

###該当のソースコード

swift

1import UIKit 2import UserNotifications 3 4class SecondViewController: UIViewController { 5 6 @IBOutlet var todo: UITextField! 7 @IBOutlet var button: UIButton! 8 @IBOutlet weak var DayTime: UITextField! 9 @IBOutlet weak var textview: UITextView! 10 11 var todoarray = [String]() 12 var todoarraydate = [String]() 13 var todocontent = [String]() 14 var todotime = [Double]() 15 var toolBar:UIToolbar! 16 var myDatePicker: UIDatePicker! 17 var time : Date = Date() 18 19 override func viewDidLoad() { 20 super.viewDidLoad() 21 _ = Timer.scheduledTimer(timeInterval: 0.001, target: self, selector: #selector(SecondViewController.check), userInfo: nil 22 , repeats: true) 23 if UserDefaults.standard.array(forKey: "todoarray") == nil { 24 todoarray = [String]() 25 } else { 26 todoarray = UserDefaults.standard.array(forKey: "todoarray") as! [String] 27 } 28 29 if UserDefaults.standard.array(forKey: "todoarraydate") == nil { 30 todoarraydate = [String]() 31 } else { 32 todoarraydate = UserDefaults.standard.array(forKey: "todoarraydate") as! [String] 33 } 34 35 if UserDefaults.standard.array(forKey: "todocontent") == nil { 36 todocontent = [String]() 37 } else { 38 todocontent = UserDefaults.standard.array(forKey: "todocontent") as! [String] 39 } 40 if UserDefaults.standard.array(forKey: "todotime") == nil { 41 todotime = [Double]() 42 } else { 43 todotime = UserDefaults.standard.array(forKey: "todotime") as! [Double] 44 } 45 // Do any additional setup after loading the view, typically from a nib. 46 47 // 入力欄の設定 48 DayTime.placeholder = "期限" //<-`dateToString`のパラメータは`Date`型なので最初から`Date()`を渡す 49 //DayTime.text = dateToString(date: Date()) //<-同上 50 self.view.addSubview(DayTime) 51 52 // UIDatePickerの設定 53 myDatePicker = UIDatePicker() 54 myDatePicker.addTarget(self, action: #selector(changedDateEvent), for: UIControlEvents.valueChanged) 55 myDatePicker.datePickerMode = UIDatePickerMode.dateAndTime 56 DayTime.inputView = myDatePicker 57 58 // UIToolBarの設定 59 toolBar = UIToolbar(frame: CGRect(x: 0, y: self.view.frame.size.height/6, width: self.view.frame.size.width, height: 40.0)) 60 61 toolBar.layer.position = CGPoint(x: self.view.frame.size.width/2, y: self.view.frame.size.height-20.0) 62 63 let toolBarBtn = UIBarButtonItem(title: "完了", style: .plain, target: self, action: #selector(tappedToolBarBtn)) 64 let toolBarBtncancel = UIBarButtonItem(title: "キャンセル", style: .plain, target: self, action: #selector(tappedToolBarBtncancel)) 65 toolBarBtn.tag = 1 66 toolBar.items = [toolBarBtn, toolBarBtncancel] 67 DayTime.inputAccessoryView = toolBar 68 69 //枠の太さ 70 textview.layer.borderWidth = 1 71 DayTime.layer.borderWidth = 1 72 todo.layer.borderWidth = 1 73 //枠のカラー 74 textview.layer.borderColor = UIColor.gray.cgColor 75 DayTime.layer.borderColor = UIColor.gray.cgColor 76 todo.layer.borderColor = UIColor.gray.cgColor 77 // 角に丸みをつける. 78 textview.layer.masksToBounds = true 79 DayTime.layer.masksToBounds = true 80 todo.layer.masksToBounds = true 81 // 丸みのサイズを設定する. 82 textview.layer.cornerRadius = 10.0 83 DayTime.layer.cornerRadius = 10.0 84 todo.layer.cornerRadius = 10.0 85 86 } 87 88 override func didReceiveMemoryWarning() { 89 super.didReceiveMemoryWarning() 90 // Dispose of any resources that can be recreated. 91 } 92 93 // 「完了」を押すと閉じる 94 func tappedToolBarBtn(_ sender: UIBarButtonItem) { 95 self.DayTime.endEditing(true) 96 } 97 // 「キャンセル」を押すと閉じる 98 func tappedToolBarBtncancel(_ sender: UIBarButtonItem) { 99 self.DayTime.text = "" 100 self.DayTime.endEditing(true) 101 } 102 func changedDateEvent(_ sender: UIDatePicker){ //<- `UIDatePicker`からのactionの`sender`は必ず`UIDatePicker`になる 103 //`sender`を直接`UIDatePicker`として使えばいいのでキャストは不要 104 self.changeLabelDate(date: sender.date) 105 } 106 107 func changeLabelDate(date: Date) { //<- `NSDate`を使っているところは全て`Date`に置き換える 108 DayTime.text = self.dateToString(date: date) 109 } 110 111 func dateToString(date: Date) -> String { 112 //DateFormatterは参照型なので、letが適切 113 let date_formatter = DateFormatter() 114 //曜日の1文字表記をしたいならweekdaysなんて配列はいらない 115 116 date_formatter.locale = Locale(identifier: "ja") 117 date_formatter.dateFormat = "yyyy年MM月dd日(E) HH:mm" //<-`E`は曜日出力用のフォーマット文字 118 return date_formatter.string(from: date as Date) 119 } 120 121 @IBAction func addtodo(_ sender: AnyObject) { 122 let statictodo = todo.text! 123 let staticTime = DayTime.text! 124 let staticcontent = textview.text! 125 todoarray.append(statictodo) 126 todoarraydate.append(staticTime) 127 todocontent.append(staticcontent) 128 todo.text = "" 129 textview.text="" 130 131 let RFC3339DateFormatter = DateFormatter() 132 RFC3339DateFormatter.locale = Locale(identifier: "en_US_POSIX") 133 RFC3339DateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZZZZZ" 134 RFC3339DateFormatter.timeZone = TimeZone(secondsFromGMT: 0) 135 136 /* 39 minutes and 57 seconds after the 16th hour of December 19th, 1996 with an offset of -08:00 from UTC (Pacific Standard Time) */ 137 let string = "1996-12-19T16:39:57-08:00" 138 let date = RFC3339DateFormatter.date(from: string) 139 todotime.append((date?.timeIntervalSinceNow)!) 140 //time = date! 141 142 UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]){ 143 (qranted, error) in 144 } 145 let content = UNMutableNotificationContent() 146 content.title = "明日課題提出だよ" 147 //content.body = "" 148 content.sound = UNNotificationSound.default() 149 150 let isrepeat = false 151159 _ = UNTimeIntervalNotificationTrigger(timeInterval: (date?.timeIntervalSinceNow)! ,repeats: isrepeat) 152 153 UserDefaults.standard.set(todoarray, forKey: "todoarray") 154 UserDefaults.standard.set(todoarraydate, forKey: "todoarraydate") 155 UserDefaults.standard.set(todocontent, forKey: "todocontent") 156 UserDefaults.standard.set(todotime, forKey: "todotime") 157 self.performSegue(withIdentifier: "Return", sender: self) 158 } 159 160 func check() { 161 if todo.text != "" && DayTime.text != "" && textview.text != ""{ 162 button.isHidden = false 163 } else { 164 button.isHidden = true 165 } 166 } 167 168}

###最後に
分からないことがあれば質問お願いします

###新たなエラーについて
イメージ説明

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

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

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

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

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

fuzzball

2017/10/09 23:17

エラーメッセージの意味が分からないんですか?
guest

回答1

0

ベストアンサー

エラーメッセージの通りですね

UNTimeIntervalNotificationTrigger - UserNotifications | Apple Developer Documentation

数字[Double](秒)を渡さなければいけないところに日付[Date]で渡してます。
ドキュメントでは「(30*60)」30分と入れてますね。
数字を渡しましょう

投稿2017/10/10 08:24

n884

総合スコア100

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

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

n884

2017/10/10 08:30

入れているdateが過去なので、実際に通知をしたい日時と現在の差を秒で入れてあげるのがいいのかな? 参考URL追加します http://swift.tecc0.com/?p=180
ssh_u

2017/10/10 12:55

DateをDoubleに変換する方法を教えていただけませんか?
fuzzball

2017/10/11 00:15

n884さんの回答やコメント、リンク先をしっかり読んで下さい。 DateをDoubleに変換するのではなく「実際に通知をしたい日時と現在の差」を求めるのです。 差の求め方についてはリンク先に書いてあります。
n884

2017/10/11 03:22

fuzzballの言われる通り、参考URLに書いてます。 試してませんが、次のようにすればいいかと //今からの秒数差 let spanNow = date.timeIntervalSinceNow
ssh_u

2017/10/11 13:59 編集

言っていただいた通りにやったら実行中にアプリが落ちるようになりエラーが発生しました エラー内容の画像をは上に貼るのでエラー内容、対処法を教えていただけるとありがたいです ソースも変更しました
n884

2017/10/11 23:36

20年以上前の日付入れてるからだと思います let string = "1996-12-19T16:39:57-08:00" let date = RFC3339DateFormatter.date(from: string) 何かのサンプルから作ってるんですかね? 数字を入れたら落ちるということは、数字の入れ方に問題があると考えて、ドキュメントをきちんと見直さないといけませんよ
ssh_u

2017/10/12 11:59

stringをdateに変換しているのですが 以下の書き方であってるのでしょうか? let RFC3339DateFormatter = DateFormatter() RFC3339DateFormatter.locale = Locale(identifier: "en_US_POSIX") RFC3339DateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZZZZZ" RFC3339DateFormatter.timeZone = TimeZone(secondsFromGMT: 0) let string = "2015-12-19T16:39:57-08:00" let date = RFC3339DateFormatter.date(from: string) todotime.append((date?.timeIntervalSinceNow)!)
n884

2017/10/13 00:27

UNTimeIntervalNotificationTrigger は、何秒後に通知するかです。 > let string = "2015-12-19T16:39:57-08:00" > let date = RFC3339DateFormatter.date(from: string) 2015 - 2017 = -2 年の時点でマイナスです。 過去に遡って送れるハズがありません。 貼り付けたコードが正しいかわからない時点で、そのコード自体がバグになるかも知れません。 プログラムをされる気があるのでしたら、どの部分で何が起きているかを自分でわかっていないといけません。 「エラーの原因」の質問から「動かないプログラムの世話をしてください」になってます。 ご自分で一度内容の整理をする必要があると思います。 この部分は何をしているのか、目的と手段があっているかなど・・・ 貼り付けただけなのでしたら、元にヒントがあるハズです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問