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

[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)")

多位选择框框
[4]SwiftUI

这里使用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)
相关标签: iOS 开发