[8/18 ~ 8/24] 기간 동안의 학습 내용
Foundation
framework에서 제공하는 API.여기서 비동기 방식이란?
우리가 서버에서 데이터를 받아올 때는 Json 데이터 형식으로 받아옴
Json 데이터 형식을 받아올 때 해당 데이터에 대한 경로를 서버에서 찾아야하고(path), completion handler를 이용해서 함수가 어떤시점에 특정 동작을 할지 지정
class URLManager {
static let shared = URLManager()
let url = URL(string: "https://jsonplaceholder.typicode.com/todos")!
private init() { }
func getJsonData(path: String, completion: @escaping (Result<Data, Error>) -> Void) {
// Result type을 가진 completion handler를 정의
let task = URLSession.shared.dataTask(with: url.appending(path: path))
{ data, response, error in
if let error {
print("Error: \(error.localizedDescription)")
completion(.failure(NetworkError.unknown(error.localizedDescription)))
return
}
guard let httpResponse = response as? HTTPURLResponse,
(200...299).contains(httpResponse.statusCode) else {
print("Error: invalid response")
completion(.failure(NetworkError.invalidResponse))
return
}
guard let data = data else {
print("Error: no data")
completion(.failure(NetworkError.emptyResponse))
return
}
completion(.success(data))
}
task.resume()
}
}
enum NetworkError: Error {
case emptyResponse
case invalidResponse
case unknown(String)
}
: Storyboard에서 ViewController 사이의 화살표로 표현하며 화면 전환을 위해 사용하는 인터페이스 요소임
identifier
를 정해주지 않았을 경우 의도치 않은 동작을 할 가능성이 있음completion handler
에서 데이터 전달 처리구현 방식은 2가지가 있다.
1.Storyboard
에서 구성한segue
prepare(for:sender:)
에서 처리showDetail
이라는identifier
를 사용하여segue
설정
// 첫 번째 화면
class FirstViewController: UIViewController {
@IBAction func buttonTapped(_ sender: UIButton) {
performSegue(withIdentifier: "showDetail", sender: nil)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "showDetail" {
if let secondViewController = segue.destination as? SecondViewController {
secondViewController.data = "Hello, Second View Controller!"
}
}
}
}
// 두 번째 화면
class SecondViewController: UIViewController {
var data: String?
@IBOutlet weak var label: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
label.text = data
}
}
code
로 구성한segue
present
를 사용해서completion handler
를 사용해 데이터를 전달
// 첫 번째 화면
class FirstViewController: UIViewController {
@IBAction func buttonTapped(_ sender: UIButton) {
let storyboard = UIStoryboard(name: "Main", bundle: nil) // 여기서 "Main"은 스토리보드의 이름입니다.
if let secondViewController = storyboard.instantiateViewController(withIdentifier: "SecondViewController") as? ViewController2 {
secondViewController.data = "Hello, Second View Controller!"
present(secondViewController, animated: true, completion: {
secondViewController.label.text = secondViewController.data
})
}
}
}
// 두 번째 화면
class SecondViewController: UIViewController {
var data: String?
@IBOutlet weak var label: UILabel!
}
push
- slide animation// 화면 전환하는 버튼을 누를 때
@IBAction func nextButtonTapped(_ sender: UIButton) {
performSegue(withIdentifier: "showNext", sender: nil)
}
// 다음 화면으로 전환할 때
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// 특정 identifier일 경우 data를 가져옴
if segue.identifier == "showNext" {
// 수직 방향으로 슬라이드하는 애니메이션 적용
segue.destination.modalTransitionStyle = .coverVertical
}
}
modal
- fade animation
modalTransitionStyle
의 종류
1.coveVertical
: 아래에서 세로로 다음ViewController
가 올라오는 방식으로 default 방식
2.filpHorizontal
: 수직으로 가운데를 축으로 삼아 가로방향으로 카드가 뒤집히는 듯한 효과를 냄
3.crossDissolve
: 화면이 교차되는 효과
4.partialCurl
: 종이를 넘기는 듯한 효과
// 다음 화면으로 전환하는 버튼을 누를 때
@IBAction func nextButtonTapped(_ sender: UIButton) {
performSegue(withIdentifier: "showNext", sender: nil)
}
// 다음 화면으로 전환할 때
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "showNext" {
// 페이드 애니메이션
segue.destination.modalTransitionStyle = .crossDissolve 적용
}
}
💁🏻♀️
presentationStyle
의 종류
: 지금의 화면이 얼마 정도의 크기인지에 영향을 받음
- 세로 상태 - 가로(
Compact
), 세로(Regular
)- 가로 상태 - 가로(
Regular
), 세로(Compact
)
fullScreen
:presentationStyle
의 기본값, 다른presentationStyle
을 적용할 수 없는 경우fullScreen
으로 동작pageSheet
: 가로가compact
일 경우fullScreen
과 동작이 동일, sheet를 띄우듯이 위와 양옆에 여백을 두고 아래에 반투명 View를 배치formSheet
: 가로가Regular
일 때 content 영역의 크기를 유지해주고 아래에 반투명 View를 배치. 가로모드이고 키보드가 나온다면 View가 위로 올라가는 처리를 자동으로 해줌 (가로compact
는fullScreen
)currentContext
:definesPresentationContext
가true
로 설정되어 있는 Viewcontroller의 영역에 맞춰 새로운 view가 띄워짐. true인 ViewController가 없는 경우 FullScreen으로 동작
- 일반 View :
false
가 기본값navigationController
등 :true
가 기본값
화면에 2개 이상의 ViewController가 영역을 차지할 때(SplitViewController 등) 하나만 바꿀경우 유용하게 사용됨
overFullScreen
:fullScreen
과 비슷하지만 띄워지는 View가 투명할 경우 아래 쌓인 View가 비쳐보임(fullScreen
에서는 아래의 view가 계층에서 지워지기 때문에 이를 방지하고 싶은 경우 사용)
6.overCurrentContext
:currentContext
와 동일하고overFullScreen
처럼 아래 쌓인 View가 지워지지 않기 때문에 비쳐 보임
7.popover
: 특정 위치에서 팝업창처럼 뜨는 형태. 두 가지의 필수 옵션(가로가regular
인 경우만 적용)
- 어느 정도의 크기? -
preferredContentSize
를 ViewController에 설정- 어떤 view를 띄울 것인가? -
popoverPresentationController
프로퍼티로 설정. 두 가지 방법 중에 반드시 하나만 적용 되어야 함
👆 barButtonItem 프로퍼티를 설정
✌️ sourceView와 sourveRect 프로퍼티를 설정
좋은 내용 감사합니다!
한가지 궁금한 게, segue 부분에서는 vc를 화면에 띄우는 방식을 present로 사용하시는 것 같은데
push - slide animation에서는 performSegue만 하면 되는건가요?