Swift UI λ₯Ό μ¬μ©ν νμκ°μ λ° λ‘κ·ΈμΈ νλ©΄ ꡬν - λ°±μλλ Django RestFramework μ¬μ©

ꡬν μμ - νμκ°μ
νμ κ°μ μ 4κ° νλͺ© (λλ€μ, μ΄λ©μΌ, λΉλ°λ²νΈ(+λΉλ°λ²νΈ νμΈ), MBTI νλͺ©)μ μ λ ₯λ°λ νλ©΄μ λ§λ λ€. μ¬κΈ°μ MBTI νλͺ©μ HTMLμμ λ§νλ μ λ νΈ λ°μ€ UIλ₯Ό μ¬μ©νμ¬ MBTIλ₯Ό μ ννλλ‘ νμλ€.
//
// SignUpView.swift
// mbtiPlayground
//
// Created by λ°μ’
ν on 2022/03/16.
//
import SwiftUI
struct SignUpView: View {
@Environment(\\.presentationMode) var presentationMode: Binding<PresentationMode>
@State private var showingAlert = false
@State var uiTabarController: UITabBarController?
@State private var email: String = ""
@State private var password: String = ""
@State private var rePassword: String = ""
@State private var username: String = ""
@State private var mbti = 0
let mbtiPicker = ["ISTJ", "ISFJ", "INFJ", "INTJ", "ISTP", "ISFP", "INFP","INTP", "ESTP", "ESFP", "ENFP", "ENTP", "ESTJ", "ESFJ", "ENFJ", "ENTJ"]
var btnBack : some View { Button(action: {
self.showingAlert = true
}){
Text("λ€λ‘κ°κΈ°")
}.alert(isPresented: $showingAlert){
Alert(title: Text("νμ κ°μ
μ·¨μ"), message: Text("νμκ°μ
μ μ·¨μνμκ² μ΅λκΉ?"),
primaryButton: .destructive(Text("μ·¨μνκΈ°"), action: {
presentationMode.wrappedValue.dismiss()
})
, secondaryButton: .cancel(Text("μ΄μ΄νκΈ°")))
}
}
var body: some View {
VStack{
Text("Sign Up")
.font(.title)
.fontWeight(.medium)
.padding()
.foregroundColor(.black)
.frame(width: 300)
HStack{
Image(systemName: "tag")
.resizable()
.scaledToFit()
.frame(width: 30, height: 30)
.padding(.bottom)
TextField("λλ€μμ μ
λ ₯νμΈμ", text: $username)
.frame(width: 300, height: 10)
.padding()
.background(Color(.systemGray6))
.cornerRadius(5.0)
.padding(.bottom, 20)
}
HStack{
Image(systemName: "person.fill")
.resizable()
.scaledToFit()
.frame(width: 30, height: 30)
.padding(.bottom)
TextField("μ΄λ©μΌμ μ
λ ₯νμΈμ.", text: $email)
.frame(width: 300, height: 10)
.padding()
.background(Color(.systemGray6))
.cornerRadius(5.0)
.padding(.bottom, 20)
}
HStack{
Image(systemName: "lock")
.resizable()
.scaledToFit()
.frame(width: 30, height: 30)
.padding(.bottom)
SecureField("λΉλ°λ²νΈλ₯Ό μ
λ ₯νμΈμ", text: $password)
.frame(width: 300, height: 10)
.padding()
.background(Color(.systemGray6))
.cornerRadius(5.0)
.padding(.bottom, 20)
}
HStack{
Image(systemName: "lock.rotation")
.resizable()
.scaledToFit()
.frame(width: 30, height: 30)
.padding(.bottom)
SecureField("λΉλ°λ²νΈλ₯Ό λ€μ μ
λ ₯νμΈμ", text: $rePassword)
.frame(width: 300, height: 10)
.padding()
.background(Color(.systemGray6))
.cornerRadius(5.0)
.padding(.bottom, 20)
}
HStack{
Text("MBTI μ νμ μ ννμΈμ: ")
.font(.headline)
.fontWeight(.medium)
.padding()
Picker("MBTI μ νμ μ ννμΈμ", selection: $mbti){
ForEach(0 ..< mbtiPicker.count){
Text(self.mbtiPicker[$0])
}
}
}
Button(action: {
print(self.email + self.password + self.rePassword + String(self.mbtiPicker[self.mbti])+self.username)
sendPostRequest("<http://localhost:8000/auth/signup>", parameters:
["email": self.email, "username": self.username, "password": self.password, "mbti": self.mbtiPicker[self.mbti]]
){
responseObject, error in guard let _ = responseObject, error == nil else {
print(error ?? "Unknown error")
return
}
}
self.presentationMode.wrappedValue.dismiss()
}){
Text("νμκ°μ
")
.frame(width: 80, height: 10)
.font(.headline)
.foregroundColor(.white)
.padding()
.background(Color(.systemBlue))
.cornerRadius(10)
}
.padding()
.onSubmit {
}
}
.padding(.all, 30)
.navigationBarBackButtonHidden(true)
.navigationBarItems(leading: btnBack)
}
}
struct SignUpView_Previews: PreviewProvider {
static var previews: some View {
SignUpView()
}
}
νμ κ°μ μ Post μμ²μΌλ‘ 보λ΄λ ν¨μλ μλμ κ°λ€ sendPostRequest
import Foundation
func sendPostRequest(_ url: String, parameters: [String: String], completion: @escaping ([String: Any]?, Error?) -> Void) {
let targetUrl = URL(string: url)
let paramData = try? JSONSerialization.data(withJSONObject: parameters)
var request = URLRequest(url: targetUrl!)
request.httpMethod = "POST"
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.httpBody = paramData
let task = URLSession.shared.dataTask(with: request) { data, response, error in
guard
let data = data, // is there data
let response = response as? HTTPURLResponse, // is there HTTP response
200 ..< 300 ~= response.statusCode, // is statusCode 2XX
error == nil // was there no error
else {
completion(nil, error)
return
}
let responseObject = (try? JSONSerialization.jsonObject(with: data)) as? [String: Any]
completion(responseObject, nil)
}
task.resume()
}
κ·Έλ°λ° μ ν¨μλ₯Ό 보면 Pyhon κ³Όλ λ€λ₯΄κ² Return κ°μ΄ μλ€.
μ΄ μ½λμ λν΄ μ€λͺ νμλ©΄ URLSession μμ 미리 μμ² λ΄μ©μ λ΄μλ ν νΈμΆ, μ€μ μ€ν(task.resume()) λΆλΆμμ νΈμΆνμ¬ λ°μ λ΄μ©μ κ°μ Έμ¨λ€.
κ·Έλ λ€λ³΄λ μ²μ swift λ₯Ό μ ν λμκ²λ μ΄λ»κ² API μλ΅ μ½λμ λν΄ μ²λ¦¬νλμ§ μλ¬Έμ΄μλ€.
κ·Έλμ λ³΄ν΅ μ¬μ©μ μλμ²λΌ μ¬μ©νκ² λλ€.
sendPostRequest("<http://localhost:8000/auth/signup>", parameters:
["email": self.email, "username": self.username, "password": self.password, "mbti": self.mbtiPicker[self.mbti]]
){
responseObject, error in guard let _ = responseObject, error == nil else {
print(error ?? "Unknown error")
return
}
}
self.presentationMode.wrappedValue.dismiss()
μ μ½λλ UI μ½λ λ΄μμ νμκ°μ λ²νΌ ν΄λ¦ μ μ‘μ μμ λμνλ ν¨μμ΄λ€. Swift μμλ ν¨μμ return κ°μ ν΄λμ€μ λ³μλ‘ ν λΉνλ λΆλΆμ΄ μλ κ²μ΄ μλ, μμ² ν¨μ λ΄μμ self.XXX λ‘ ν΄λμ€ λ³μμ μ κ·Όνμ¬ κ°μ λ³κ²½νλκ² λλΆλΆμ΄λ€.
μ΄λ λ€λ³΄λ Swift UI λ΄μμ ν΄λμ€ λ³μλ₯Ό μ μΈνκ³ μ μ¬μ©νλ λ°©λ²μ μ°κ΅¬νμ¬μΌ νλ€.
'IOS(Swift)' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[IOS/Swift] MBTI μΉ΄λ μ ν κ²μ UI ꡬν (0) | 2022.05.22 |
---|---|
[IOS/Swift] μ½ν μΈ κ²μ μ± κ΅¬ν - 4. λ‘κ·ΈμΈ UI ꡬν (0) | 2022.04.04 |
[IOS/Swift] μ½ν μΈ κ²μ μ± κ΅¬ν - 2. μ±ν λ°© UI ꡬν (0) | 2022.03.05 |
[IOS/Swift] μ½ν μΈ κ²μ μ± κ΅¬ν - 1. μ½ν μΈ UI ꡬν (0) | 2022.03.05 |