SwiftUI2.0更新五使用DatePicker提醒事件
DatePicker
升级后的DatePicker变得比以前好用了,改变了选择方式,从而选择日期,年份什么的更方便了,至少比之前的方便不少。
学习一个简单的提醒事件,通过选择DatePicker来确定提醒时间及日期,然后提醒,过程中涉及对Modifier的自定义,方便重复利用已经制作好的Modifier。
- 新建SwiftUI工程,命名随便。
- 新建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
先上一张效果图。工程完成后的界面就是这个样子的。然后上代码
在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(“提醒开启成功”)
}
完成!!
几个文本输入与显示的地方还可以修改一下,为每一个text以及textField添加如下modifier
不一一例举了
上图
如果工程中需要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()
等等...
运行后
界面与之前一样。
本文地址:https://blog.csdn.net/jackwsd/article/details/107199611
上一篇: qemu-参数解析
下一篇: mybatis 一:基本的配置框架