[4]SwiftUI
程序员文章站
2024-03-24 12:46:22
...
navigationBarItem
添加一个navigationBarItem填充一个按钮,并且完成sheet
sheet内容即按下NavigationBarButton弹出的内容
.navigationBarItems(trailing:
Button(action:{self.showingProfile.toggle()}) {
Image(systemName: "person.crop.circle")
.font(.largeTitle)
.padding()
}
)
.sheet(isPresented: $showingProfile) {
Text("hello")
}
单例模式
Self代表着User,Self只能在静态属性中运用,因为静态属性不依赖User的实例化
struct User {
var username: String
//因为是特殊关键字,所以要用单引号
static let `default` = Self(username: "jiehaoZhang")
}
//单例模式
User.default
editMode
系统提供好了很多Environment,editMode也是其中之一,可以直接取出使用
@Environment(\.editMode) var mode
判断是否在editMode
if mode?.wrappedValue == .inactive {}else{}
添加editButton
HStack {
Button(action: {print("hello")}) {
Text("完成")
}
Spacer()
EditButton().padding()
}
Date类型转换为String类型
var dateFormatter: DateFormatter {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy年M月d日"
return dateFormatter
}
Text("生日: \(profile.birthday ,formatter: dateFormatter)")
展示枚举的数据
用.rawValue
Text("喜欢的季节: \(profile.prefersSeason.rawValue)")
多位选择框框
这里使用allCases的前提是必须遵守CaseIterable协议
enum Season: String, CaseIterable {
case spring = "????"
case summer = "????"
case autumn = "????"
case winter = "☃️"
}
Picker("喜欢的季节", selection: $profile.prefersSeason) {
ForEach(User.Season.allCases,id: \.self) { season in
Text(season.rawValue).tag(season)
}
}
.pickerStyle(SegmentedPickerStyle())
时间选择器
DatePicker("生日",selection: $profile.birthday,displayedComponents: .date)
数据流
利用profileCopy完成取消的功能
在编辑模式使用profileCopy变量
@State private var profileCopy = User(username: "jiehaoZhang", prefersNotifications: true, prefersSeason: .summer)
在完成按钮action中用profileCopy覆盖profile
(mode下添加动画的方法)
Button(action: {
self.profile = self.profileCopy
//添加动画,所有因为mode改变的视图都会有动画效果
self.mode?.animation().wrappedValue = .inactive
}) {
Text("完成")
}
在取消按钮action中用profile覆盖profileCopy,这里用到onDisappear生命周期函数
.onDisappear{
self.profileCopy = self.profile
}
@State类型变量的传值
在profileEditor中建立一个@Binding var类型的变量接收值
@Binding var profileCopy: User
在previews中给定一个constant
struct ProfileEditor_Previews: PreviewProvider {
static var previews: some View {
ProfileEditor(profileCopy: .constant(.default))
}
}
在profile中传Binding类型的值
ProfileEditor(profileCopy: $profileCopy)
上一篇: Spring:基于xml和注解的事务
下一篇: Spring IOC