欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

SwiftUI2.0更新五使用DatePicker提醒事件

程序员文章站 2022-03-30 10:16:10
DatePicker升级后的DatePicker变得比以前好用了,改变了选择方式,从而选择日期,年份什么的更方便了,至少比之前的方便不少。学习一个简单的提醒事件,通过选择DatePicker来确定提醒时间及日期,然后提醒,过程中涉及对Modifier的自定义,方便重复利用已经制作好的Modifier。新建SwiftUI工程,命名随便。新建swift文档,用于操作LocalNotification.代码import Foundationimport SwiftUIclass LocalN...

DatePicker

升级后的DatePicker变得比以前好用了,改变了选择方式,从而选择日期,年份什么的更方便了,至少比之前的方便不少。
学习一个简单的提醒事件,通过选择DatePicker来确定提醒时间及日期,然后提醒,过程中涉及对Modifier的自定义,方便重复利用已经制作好的Modifier。

  1. 新建SwiftUI工程,命名随便。
  2. 新建swift文档,用于操作LocalNotification.
    代码
import Foundation
import SwiftUI

class LocalNotificationManager: ObservableObject{}

在类中,添加如下代码,配置通知的各种参数

var notifications = [Notification]()
    
    init(){
        UNUserNotificationCenter.current().requestAuthorization(options: [.alert,.badge,.sound]){
            granted,error in
            if granted == true && error == nil{
                print("用户允许操作")
            }else {
                print("用户拒绝")
            }
        }
    }
    
    func sendNotification(title:String, subtitle: String?,body: String,lanchIn:Date){
        
        let content = UNMutableNotificationContent()
        content.title = title
        if let subtitle = subtitle{
            content.subtitle = subtitle
        }
        content.body = body
        
        let name = "view"
        //工程中加入了图片,从网上down的,命名为view
        guard let imageURL = Bundle.main.url(forResource: name, withExtension: "jpg") else {
            return
        }
        
        let attachment = try! UNNotificationAttachment(identifier: name, url: imageURL, options: .none)
        content.attachments = [attachment]
        let calendar = Calendar(identifier: .gregorian)
        let components = calendar.dateComponents([.year,.month,.day,.hour,.minute], from: lanchIn)
        //以日历匹配方式触发
        let trigger = UNCalendarNotificationTrigger(dateMatching: components, repeats: false)
        let request = UNNotificationRequest(identifier: "notification", content: content, trigger: trigger)
        
        UNUserNotificationCenter.current().add(request, withCompletionHandler: nil)
    }

到此,localNotification配置差不多了.

3.进入content.swift
先上一张效果图。工程完成后的界面就是这个样子的。然后上代码
SwiftUI2.0更新五使用DatePicker提醒事件
在ContentView中,定义如下变量

	@State private var dueDate = Date()
    @State var showFootnote = false
    @State private var typeText = ""
    @ObservedObject var notificationManager = LocalNotificationManager()
为了显示日期的规范化,加入了compute 变量,应该算是swift特色闭包应用
var dateFormatter: DateFormatter {
        
   let formatter = DateFormatter()
   formatter.locale = Locale(identifier: "zh_CN")
   //yy:年 mm : 月    dd : 日期     E : 星期几      HH:mm : 24小时制     h:mm a : 12小时制
   formatter.dateFormat = "yy/MM/dd/E hh:mm a"
   return formatter
        }

此时变量是不能定义为@State类型的
估计是我最中运行在模拟器上的原因,模拟器已经配置本地语言为简体中文,所以就算local选择中国,显示时还是没有显示中文。

在body内

依次加入各种组件

VStack{
TextField("输入提醒内容", text: $typeText)
DatePicker(selection: $dueDate, displayedComponents: [.hourAndMinute,.date]) {
                    Text("Select a date")
                }.frame(maxHeight:300)
Text("您选择的提醒时间为: \(dueDate, formatter: dateFormatter)")
}

在 ***Text("您选择的提醒时间为)***之下加入Button
Button的action中引入了Animation,就是动画,使用的是默认的动画模式,即使是布尔变量,依然可以引入动画。

Button(action: {
      withAnimation{
          self.showFootnote.toggle()
          self.notificationManager.sendNotification(title: "Hello", subtitle: nil, body: typeText, lanchIn: self.dueDate)}}){
           Text("开启提醒")
     }                                       

开启提醒成功提示
if showFootnote{
Text(“提醒开启成功”)
}
完成!!
SwiftUI2.0更新五使用DatePicker提醒事件
SwiftUI2.0更新五使用DatePicker提醒事件
SwiftUI2.0更新五使用DatePicker提醒事件

SwiftUI2.0更新五使用DatePicker提醒事件
几个文本输入与显示的地方还可以修改一下,为每一个text以及textField添加如下modifier
SwiftUI2.0更新五使用DatePicker提醒事件
SwiftUI2.0更新五使用DatePicker提醒事件
不一一例举了
上图SwiftUI2.0更新五使用DatePicker提醒事件
SwiftUI2.0更新五使用DatePicker提醒事件
如果工程中需要modifier的很多,可以考虑自定modifier。
关于modifier后续单独学习,单⬆️代码

struct BorderedViewModifier: ViewModifier{
    func body(content: Content) -> some View {
        content
            .padding(EdgeInsets(top: 8, leading: 16, bottom: 8, trailing: 16))
                .overlay(RoundedRectangle(cornerRadius: 8)
                    .stroke(lineWidth:2)
                    .foregroundColor(.blue)
            ).shadow(color: Color.gray.opacity(0.4), radius: 3, x: 1, y: 2)
    }
}

extension View{
    func bordered() -> some View{
        ModifiedContent(content: self, modifier: BorderedViewModifier())
    }
}

然后

TextField("输入提醒内容", text: $typeText)
    .bordered()
Text("开启提醒")
    .bordered()
等等...

运行后
SwiftUI2.0更新五使用DatePicker提醒事件
界面与之前一样。

本文地址:https://blog.csdn.net/jackwsd/article/details/107199611