import Foundation
import Combine
class RegisterViewModel:ObservableObject {
@Published var username = ""
@Published var password = ""
@Published var checkUsername = false
@Published var checkPassword = false
private var cancelSet:Set<AnyCancellable> = []
init() {
$username.receive(on: RunLoop.main)
.map { username in
username.count > 0
}
.assign(to: \.checkUsername, on: self)
.store(in: &cancelSet)
$password.receive(on: RunLoop.main)
.map { password in
!password.isEmpty
}
.assign(to: \.checkPassword, on: self)
.store(in: &cancelSet)
}
}
struct InputErrorView: View {
var message = ""
var body: some View {
HStack(alignment: .center) {
Image(systemName: "exclamationmark.circle.fill")
.foregroundColor(.red)
Text(message)
.foregroundColor(.red)
}
.padding(.leading,10)
}
}
struct InputErrorView_Previews: PreviewProvider {
static var previews: some View {
InputErrorView()
}
}
struct RegisterView: View {
@ObservedObject private var viewModel = RegisterViewModel()
var body: some View {
VStack(alignment: .leading) {
TextField("请输入账户", text: $viewModel.username)
.font(.system(size: 20,weight: .black))
.padding(.horizontal)
Divider()
.background(.red)
.padding(.horizontal)
if viewModel.checkUsername == false {
InputErrorView(message: "请输入账户")
}
SecureField("请输入密码", text: $viewModel.password)
.font(.system(size: 20,weight: .black))
.padding(.horizontal)
.padding(.top,20)
Divider()
.background(.red)
.padding(.horizontal)
if viewModel.checkPassword == false {
InputErrorView(message: "请输入密码")
}
Button {
print("注册操作")
} label: {
Text("注册")
.font(.system(size: 20,weight: .bold))
.foregroundColor(.white)
.padding(.top,10)
.padding(.bottom,10)
}
.frame(maxWidth: .infinity)
.background(.black)
.cornerRadius(8)
.padding(.top,20)
.padding(.horizontal)
}
}
}
struct RegisterView_Previews: PreviewProvider {
static var previews: some View {
RegisterView()
}
}
