UIDatepickerで設定し取得した時間の値を用いて、その時間に通知させる方法について。
解決済
回答 1
投稿
- 評価
- クリップ 0
- VIEW 2,034
こんにちは。UIDatepickerで設定し取得した時間の値を用いて、その時間に通知を送りたいです。でも、UIDatepickerで取得できる値は例えば「15時30分」に設定したら「15:30」という値で取得すると思います。これを通知する時間に設定する場合、「15」という時の値と「30」という分の値としてそれぞれ切り分けて扱いたいのですがそのやり方がいまいちわかりません。どうかご教授お願いしますm(_ _)m
以下は現状のソースコードです。
import UIKit
class ViewController: UIViewController, UIPickerViewDelegate {
private var myTextField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
let now = NSDate()
println(now);// -> 2015-09-15 23:06:47 +0000
let calendar = NSCalendar(identifier: NSCalendarIdentifierGregorian)
var comps:NSDateComponents = calendar!.components(NSCalendarUnit.HourCalendarUnit|NSCalendarUnit.MinuteCalendarUnit|NSCalendarUnit.SecondCalendarUnit,fromDate: now)
comps.calendar = calendar;
comps.hour = 15; //ここの15と30に、datepickerで取得した値を持っていきたい。
comps.hour = 30; //
let now2 = comps.date;
println(now2);// -> Optional(0000-12-31 22:47:48 +0000)
var notification = UILocalNotification()
notification.alertBody = "test"
notification.timeZone = NSTimeZone.defaultTimeZone();
notification.fireDate = now2;
notification.repeatInterval = NSCalendarUnit.CalendarUnitDay;
UIApplication.sharedApplication().scheduleLocalNotification(notification)
self.view.backgroundColor = UIColor.whiteColor()
// DatePickerを生成する.
let myDatePicker: UIDatePicker = UIDatePicker()
// datePickerを設定(デフォルトでは位置は画面上部)する.
myDatePicker.frame = CGRectMake(0, 50, self.view.frame.width, 200)
myDatePicker.timeZone = NSTimeZone.localTimeZone()
myDatePicker.backgroundColor = UIColor.whiteColor()
myDatePicker.layer.cornerRadius = 5.0
myDatePicker.layer.shadowOpacity = 0.5
// 値が変わった際のイベントを登録する.
myDatePicker.addTarget(self, action: "onDidChangeDate:", forControlEvents: .ValueChanged)
// DataPickerをViewに追加する.
self.view.addSubview(myDatePicker)
// UITextFieldを作成する.
myTextField = UITextField(frame: CGRectMake(0,0,200,30))
myTextField.text = ""
myTextField.borderStyle = UITextBorderStyle.RoundedRect
myTextField.layer.position = CGPoint(x: self.view.bounds.width/2,y: self.view.bounds.height - 100);
println(cnt)
// UITextFieldをViewに追加する.
self.view.addSubview(myTextField)
}
/*
DatePickerが選ばれた際に呼ばれる.
*/
internal func onDidChangeDate(sender: UIDatePicker){
// フォーマットを生成.
let myDateFormatter: NSDateFormatter = NSDateFormatter()
myDateFormatter.dateFormat = "HH:mm" //"yyyy/MM/dd hh:mm"
// 日付をフォーマットに則って取得.
let mySelectedDate: NSString = myDateFormatter.stringFromDate(sender.date)
myTextField.text = mySelectedDate as String
println(mySelectedDate)
var hour = mySelectedDate
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
質問の意味があまり理解できなかったのですが、UIDatePickerで決めた時間に通知をするという理解でよろしいでしょうか?
その場合、UIDatePickerのfireDateというプロパティにNSDate型の値を入れてあげればよいので、UIDatapickerの値をそのまま代入してあげればよいと思います。
そうすれば、その日からrepeatIntervalで指定した日付で時間は同じ時間にプッシュ通知がくると思います。
今回はボタンを押した時に、時間を決定することにしています。
import UIKit
class ViewController: UIViewController, UIPickerViewDelegate {
private var myTextField: UITextField!
var notification: UILocalNotification! // 変更
let myDatePicker: UIDatePicker = UIDatePicker() //変更
override func viewDidLoad() {
super.viewDidLoad()
let now = NSDate()
println(now);// -> 2015-09-15 23:06:47 +0000
let calendar = NSCalendar(identifier: NSCalendarIdentifierGregorian)
var comps:NSDateComponents = calendar!.components(NSCalendarUnit.HourCalendarUnit|NSCalendarUnit.MinuteCalendarUnit|NSCalendarUnit.SecondCalendarUnit,fromDate: now)
comps.calendar = calendar;
comps.hour = 15; //ここの15と30に、datepickerで取得した値を持っていきたい。
comps.hour = 30; //
// notificationのfireDateとUIApplication.sharedApplication().scheduleLocalNotification(notification)をボタンのなかで実装しました
let now2 = comps.date;
println(now2);// -> Optional(0000-12-31 22:47:48 +0000)
notification = UILocalNotification()
notification.alertBody = "test"
notification.timeZone = NSTimeZone.defaultTimeZone();
notification.repeatInterval = NSCalendarUnit.CalendarUnitDay
self.view.backgroundColor = UIColor.whiteColor()
// DatePickerを生成する.
let myDatePicker: UIDatePicker = UIDatePicker()
// datePickerを設定(デフォルトでは位置は画面上部)する.
myDatePicker.frame = CGRectMake(0, 50, self.view.frame.width, 200)
myDatePicker.timeZone = NSTimeZone.localTimeZone()
myDatePicker.backgroundColor = UIColor.whiteColor()
myDatePicker.layer.cornerRadius = 5.0
myDatePicker.layer.shadowOpacity = 0.5
// 値が変わった際のイベントを登録する.
myDatePicker.addTarget(self, action: "onDidChangeDate:", forControlEvents: .ValueChanged)
// DataPickerをViewに追加する.
self.view.addSubview(myDatePicker)
// UITextFieldを作成する.
myTextField = UITextField(frame: CGRectMake(0,0,200,30))
myTextField.text = ""
myTextField.borderStyle = UITextBorderStyle.RoundedRect
myTextField.layer.position = CGPoint(x: self.view.bounds.width/2,y: self.view.bounds.height - 100);
println(cnt)
// UITextFieldをViewに追加する.
self.view.addSubview(myTextField)
}
/*
DatePickerが選ばれた際に呼ばれる.
*/
internal func onDidChangeDate(sender: UIDatePicker){
// フォーマットを生成.
let myDateFormatter: NSDateFormatter = NSDateFormatter()
myDateFormatter.dateFormat = "HH:mm" //"yyyy/MM/dd hh:mm"
// 日付をフォーマットに則って取得.
let mySelectedDate: NSString = myDateFormatter.stringFromDate(sender.date)
myTextField.text = mySelectedDate as String
println(mySelectedDate)
var hour = mySelectedDate
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
// 今回はボタンをつけました
@IBAction func selectedFireBtn() {
notification.fireDate = myDatePicker.date
UIApplication.sharedApplication().scheduleLocalNotification(notification)
}
}
実際には動かしてないので、怪しいですが、実装後うまく行ったかどうか教えていただければと思います
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.37%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる