2017-04-04 3 views
0

UIPickerViewで選択された行の値を取得しようとしています。選択した行に応じて、繰り返す通知の時間間隔を設定します。すなわち、ユーザはUIPickerViewで「毎2分」を選択し、120.0秒ごとに通知を受ける。UIPickerViewの選択した値を通知の時間間隔として使用する方法は?

2番目の「didSelectRow」メソッドは、変数intervalに値を格納していないようですが、これまでの解決策は見つかりませんでした。

これは、これまでの私のコードです:

import UIKit 
import UserNotifications 
import UserNotificationsUI 

class ViewController: UIViewcontroller, UIPickerViewDataSource, UIPickerViewDelegate { 
    // The following lines define the parameters for Picker View 
    @IBOutlet weak var myLabel: UILabel! 
    @IBOutlet weak var myPicker: UIPickerView! 

    let pickerData = ["Every minute", "Every 2 minutes", "Every 3 minutes", "Every 4 minutes", "Every 5 minutes", "Every 6 minutes", "Every 7 minutes", "Every 8 minutes", "Every 9 minutes", "Every 10 minutes"] 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     myPicker.delegate = self 
     myPicker.dataSource = self 
    } 

    func numberOfComponents(in pickerView: UIPickerView) -> Int { 
     return 1 
    } 

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { 
      return pickerData.count 
    } 

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { 
     return pickerData[row] 
    } 

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { 
     myLabel.text = pickerData[row] 
    } 

    var interval: TimeInterval = 60.0 // Assume that row 0 is selected by default 

    // The following method might be the tricky part I guess. 

    func pickerView(pickerView: UIPickerView!, didSelectRow row: Int, inComponent component: Int) { 
interval = Double(row+1) * 60.0 
    } 


    let requestIdentifier = "SampleRequest" //identifier is to cancel the notification request 

    @IBAction func triggerNotification(){ 
     print("notification will be triggered in five seconds..Hold on tight") 
     let content = UNMutableNotificationContent() 
     content.title = "Placeholder" 
     content.subtitle = "Placeholder" 
     content.body = "Placeholder" 
     content.sound = UNNotificationSound.default() 

     let trigger = UNTimeIntervalNotificationTrigger.init(timeInterval:self.interval, repeats: true) 
     let request = UNNotificationRequest(identifier:requestIdentifier, content: content, trigger: trigger) 

     UNUserNotificationCenter.current().delegate = self 
     UNUserNotificationCenter.current().add(request){(error) in 
      if (error != nil){ 
       print(error?.localizedDescription ?? "User instance is nil") 
      } 
     } 
    } 

    @IBAction func stopNotification(_ sender: AnyObject) { 

     print("Removed all pending notifications") 
     let center = UNUserNotificationCenter.current() 
     center.removePendingNotificationRequests(withIdentifiers: [requestIdentifier]) 
    } 
} 

誰もこれで私を助けることができますか?

+1

時間に対応する値の配列を作成し、次にピッカービューの選択したインデックスを使用して配列から値を取得する必要があります – Paulw11

+0

私はこれについてあなたに従うことができるか分かりません。値の配列は、60.0,120.0などの配列を意味しますか?そして、他の配列から値を取得するために、pickerviewの選択されたインデックスをどのように使用しますか? – Adrian

+0

正確です。それでは単純に 'timeDelay = times [row]' – Paulw11

答えて

0

は、私は次の作業を実行して、それを解決してきたようです。私はすべてが正しく私が必要な値をintervalに保存しようとしているところまで正しく動作していることに気づいた。方法はそれをしないだろうが、前の方法はrowを正しく割り当てるだろう。

var interval: TimeInterval = 60.0 // Assume that row 0 is selected by default 
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int,   inComponent component: Int) { 
    myLabel.text = pickerData[row] 
    interval = Double(row+1) * 60.0 
} 

これはintervalに正しい値を動作し、記憶する、例えば:私はこのようなmyLabel.text = pickerData[row]を有する機能にラインinterval = Double(row+1) * 60.0を含めこれに代え

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int,   inComponent component: Int) { 
    myLabel.text = pickerData[row] 
} 

var interval: TimeInterval = 60.0 // Assume that row 0 is selected by default 

func pickerView(pickerView: UIPickerView!, didSelectRow row: Int, inComponent component: Int) { 
interval = Double(row+1) * 60.0 
} 

「2分ごと」の行を選択すると、120.0が格納されます。

0

ので

let pickerData = ["Every minute", "Every 2 minutes", "Every 3 minutes", "Every 4 minutes", "Every 5 minutes", "Every 6 minutes", "Every 7 minutes", "Every 8 minutes", "Every 9 minutes", "Every 10 minutes"] 
let minutes[Int] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
var interval: Inte = 0 
のような配列がある今、あなたはintとして、あなたの間隔を持ってこの

func pickerView(pickerView: UIPickerView!, didSelectRow row: Int, inComponent component: Int) { 
    interval = minutes[row] 
} 

にごpickerView didSelectRow機能を変更

分の配列を作成し、数分の下であなたの間隔変数権利を宣言どの行が選択されているかに応じて1から10までです。

@IBAction func triggerNotification(){ 
    print("notification will be triggered in five seconds..Hold on tight") 
    let content = UNMutableNotificationContent() 
    content.title = "Placeholder" 
    content.subtitle = "Placeholder" 
    content.body = "Placeholder" 
    content.sound = UNNotificationSound.default() 

    let minute = TimeInterval(interval * 60) 

    let trigger = UNTimeIntervalNotificationTrigger.init(timeInterval:(minute), repeats: true) 
    let request = UNNotificationRequest(identifier:requestIdentifier, content: content, trigger: trigger) 

    UNUserNotificationCenter.current().delegate = self 
    UNUserNotificationCenter.current().add(request){(error) in 
     if (error != nil){ 
      print(error?.localizedDescription ?? "User instance is nil") 
     } 
    } 
} 

私は、TimeIntervalの積算間隔* 60の新しい分変数を作成しました。 intervalが2の場合、2 * 60 = 120となります。

+0

よろしくお願いいたします。しかし、私は 'let minute:TimeInterval = interval * 60'の行に次のようなエラーが出ます:" 2進演算子 '*'は2つの 'Int'オペランドには適用できません。 – Adrian

+0

私は例を更新して再度見てください私は分分の配列を変更しても分= TimeInterval(間隔* 60)それはトリックを行う必要があります –

0

あなたは、単に選択された行に1を追加して、60.0を掛けすることができます

var interval: TimeInterval = 60.0 // Assume that row 0 is selected by default 

func pickerView(pickerView: UIPickerView!, didSelectRow row: Int, inComponent component: Int) { 
    interval = Double(row+1) * 60.0 
} 

@IBAction func triggerNotification() { 

    let content = UNMutableNotificationContent() 
    content.title = "Placeholder" 
    content.subtitle = "Placeholder" 
    content.body = "Placeholder" 
    content.sound = UNNotificationSound.default() 

    let trigger = UNTimeIntervalNotificationTrigger.init(timeInterval:interval, repeats: true) 
    let request = UNNotificationRequest(identifier:requestIdentifier, content: content, trigger: trigger) 

    UNUserNotificationCenter.current().delegate = self 
    UNUserNotificationCenter.current().add(request){(error) in 
     if (error != nil){ 
      print(error?.localizedDescription ?? "User instance is nil") 
     } 
    } 
} 
+0

クール、この種の作品。しかし、私は選択肢から取得するよりも1分早く通知を受けています(たとえば、「2分ごと」を選択して毎分取得します)。何故ですか?それは2を加えなければなりませんか? また、私は 'Double(row + 1)'と言っているはずだと思いますよね? – Adrian

+0

わかりません。コードは正しいはずです。 'row'と' interval'にはどんな価値がありますか? – Paulw11

+0

私は仕事中ですので、現時点では確認できませんが、後で確認します。しかし、私は、アプリケーションがどの行が選択されていても毎分通知を送信することに気付いた。どんなアイデアが間違っているのでしょうか? – Adrian

関連する問題