首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用选定的UIPickerView值作为通知的时间间隔?

如何使用选定的UIPickerView值作为通知的时间间隔?
EN

Stack Overflow用户
提问于 2017-04-04 20:51:31
回答 3查看 1.1K关注 0票数 0

我正在尝试从UIPickerView中的选定行中获取一个值,并根据选定的行设置重复通知的时间间隔。也就是说,用户在UIPickerView中选择“每2分钟一次”,并每120.0秒收到一次通知。

第二个"didSelectRow“方法似乎没有将值存储在变量interval中,到目前为止还没有找到解决方案。

到目前为止,这是我的代码:

代码语言:javascript
复制
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])
    }
}

有人能帮我吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-04-05 17:01:19

似乎我已经通过以下步骤解决了这个问题。因为我注意到一切都在正常运行,直到我试图在interval中存储我所需的值--这个方法就是做不到,但是之前的方法会正确地分配row

而不是这个

代码语言:javascript
复制
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
}

我将行interval = Double(row+1) * 60.0包含在具有myLabel.text = pickerData[row]的函数中,如下所示:

代码语言:javascript
复制
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中工作并存储正确的值,例如,当您选择行“每2分钟”时,它存储120.0。

票数 0
EN

Stack Overflow用户

发布于 2017-04-04 22:13:51

创建一个分钟数组,并在分钟数组下面声明interval变量,如下所示

代码语言:javascript
复制
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

将pickerView didSelectRow函数更改为

代码语言:javascript
复制
func pickerView(pickerView: UIPickerView!, didSelectRow row: Int, inComponent component: Int) {
    interval = minutes[row]
}

现在,您的间隔为int,即从1到10,这取决于选择了哪一行。

代码语言:javascript
复制
@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。如果间隔为2,则为2*60 = 120,依此类推。

票数 0
EN

Stack Overflow用户

发布于 2017-04-04 22:36:24

您可以简单地将1添加到选定的行中,然后乘以60.0:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43217476

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档