You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
216 lines
7.4 KiB
216 lines
7.4 KiB
import SwiftUI
|
|
|
|
// MARK: - 联系人信息输入组件
|
|
struct ContactInputView: View {
|
|
@Binding var firstName: String
|
|
@Binding var lastName: String
|
|
@Binding var phone: String
|
|
@Binding var email: String
|
|
@Binding var company: String
|
|
@Binding var title: String
|
|
@Binding var address: String
|
|
@Binding var website: String
|
|
@Binding var nickname: String
|
|
@Binding var birthday: Date
|
|
@Binding var note: String
|
|
@FocusState var focusedField: ContactField?
|
|
|
|
// 联系人字段枚举
|
|
enum ContactField: Hashable {
|
|
case firstName, lastName, phone, email, company, title, address, website, nickname, birthday, note
|
|
}
|
|
|
|
var body: some View {
|
|
VStack(spacing: 16) {
|
|
// 姓名
|
|
HStack(spacing: 12) {
|
|
VStack(alignment: .leading, spacing: 8) {
|
|
HStack {
|
|
Text("名")
|
|
.font(.subheadline)
|
|
.foregroundColor(.primary)
|
|
Text("*")
|
|
.foregroundColor(.red)
|
|
Spacer()
|
|
}
|
|
|
|
TextField("名", text: $firstName)
|
|
.textFieldStyle(RoundedBorderTextFieldStyle())
|
|
.focused($focusedField, equals: .firstName)
|
|
}
|
|
|
|
VStack(alignment: .leading, spacing: 8) {
|
|
HStack {
|
|
Text("姓")
|
|
.font(.subheadline)
|
|
.foregroundColor(.primary)
|
|
Text("*")
|
|
.foregroundColor(.red)
|
|
Spacer()
|
|
}
|
|
|
|
TextField("姓", text: $lastName)
|
|
.textFieldStyle(RoundedBorderTextFieldStyle())
|
|
.focused($focusedField, equals: .lastName)
|
|
}
|
|
}
|
|
|
|
// 昵称
|
|
VStack(alignment: .leading, spacing: 8) {
|
|
HStack {
|
|
Text("昵称")
|
|
.font(.subheadline)
|
|
.foregroundColor(.primary)
|
|
Spacer()
|
|
}
|
|
|
|
TextField("昵称", text: $nickname)
|
|
.textFieldStyle(RoundedBorderTextFieldStyle())
|
|
.focused($focusedField, equals: .nickname)
|
|
}
|
|
|
|
// 电话
|
|
VStack(alignment: .leading, spacing: 8) {
|
|
HStack {
|
|
Text("电话")
|
|
.font(.subheadline)
|
|
.foregroundColor(.primary)
|
|
Spacer()
|
|
}
|
|
|
|
TextField("+86 138 0013 8000", text: $phone)
|
|
.textFieldStyle(RoundedBorderTextFieldStyle())
|
|
.keyboardType(.phonePad)
|
|
.focused($focusedField, equals: .phone)
|
|
}
|
|
|
|
// 邮箱
|
|
VStack(alignment: .leading, spacing: 8) {
|
|
HStack {
|
|
Text("邮箱")
|
|
.font(.subheadline)
|
|
.foregroundColor(.primary)
|
|
Spacer()
|
|
}
|
|
|
|
TextField("user@example.com", text: $email)
|
|
.textFieldStyle(RoundedBorderTextFieldStyle())
|
|
.keyboardType(.emailAddress)
|
|
.autocapitalization(.none)
|
|
.focused($focusedField, equals: .email)
|
|
}
|
|
|
|
// 公司
|
|
VStack(alignment: .leading, spacing: 8) {
|
|
HStack {
|
|
Text("公司")
|
|
.font(.subheadline)
|
|
.foregroundColor(.primary)
|
|
Spacer()
|
|
}
|
|
|
|
TextField("公司名称", text: $company)
|
|
.textFieldStyle(RoundedBorderTextFieldStyle())
|
|
.focused($focusedField, equals: .company)
|
|
}
|
|
|
|
// 职位
|
|
VStack(alignment: .leading, spacing: 8) {
|
|
HStack {
|
|
Text("职位")
|
|
.font(.subheadline)
|
|
.foregroundColor(.primary)
|
|
Spacer()
|
|
}
|
|
|
|
TextField("职位名称", text: $title)
|
|
.textFieldStyle(RoundedBorderTextFieldStyle())
|
|
.focused($focusedField, equals: .title)
|
|
}
|
|
|
|
// 地址
|
|
VStack(alignment: .leading, spacing: 8) {
|
|
HStack {
|
|
Text("地址")
|
|
.font(.subheadline)
|
|
.foregroundColor(.primary)
|
|
Spacer()
|
|
}
|
|
|
|
TextField("详细地址", text: $address)
|
|
.textFieldStyle(RoundedBorderTextFieldStyle())
|
|
.focused($focusedField, equals: .address)
|
|
}
|
|
|
|
// 网站
|
|
VStack(alignment: .leading, spacing: 8) {
|
|
HStack {
|
|
Text("网站")
|
|
.font(.subheadline)
|
|
.foregroundColor(.primary)
|
|
Spacer()
|
|
}
|
|
|
|
TextField("https://example.com", text: $website)
|
|
.textFieldStyle(RoundedBorderTextFieldStyle())
|
|
.keyboardType(.URL)
|
|
.autocapitalization(.none)
|
|
.focused($focusedField, equals: .website)
|
|
}
|
|
|
|
// 生日
|
|
VStack(alignment: .leading, spacing: 8) {
|
|
HStack {
|
|
Text("生日")
|
|
.font(.subheadline)
|
|
.foregroundColor(.primary)
|
|
Spacer()
|
|
}
|
|
|
|
DatePicker("选择生日", selection: $birthday, displayedComponents: .date)
|
|
.datePickerStyle(CompactDatePickerStyle())
|
|
.focused($focusedField, equals: .birthday)
|
|
}
|
|
|
|
// 备注
|
|
VStack(alignment: .leading, spacing: 8) {
|
|
HStack {
|
|
Text("备注")
|
|
.font(.subheadline)
|
|
.foregroundColor(.primary)
|
|
Spacer()
|
|
}
|
|
|
|
TextField("备注信息", text: $note)
|
|
.textFieldStyle(RoundedBorderTextFieldStyle())
|
|
.focused($focusedField, equals: .note)
|
|
}
|
|
}
|
|
.toolbar {
|
|
ToolbarItemGroup(placement: .keyboard) {
|
|
Spacer()
|
|
Button("完成") {
|
|
focusedField = nil
|
|
}
|
|
.foregroundColor(.blue)
|
|
.font(.system(size: 16, weight: .medium))
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
#Preview {
|
|
ContactInputView(
|
|
firstName: .constant(""),
|
|
lastName: .constant(""),
|
|
phone: .constant(""),
|
|
email: .constant(""),
|
|
company: .constant(""),
|
|
title: .constant(""),
|
|
address: .constant(""),
|
|
website: .constant(""),
|
|
nickname: .constant(""),
|
|
birthday: .constant(Date()),
|
|
note: .constant("")
|
|
)
|
|
} |