Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- swift documentation
- clean architecture
- map
- Protocol
- Refactoring
- UITextView
- Xcode
- HIG
- swiftUI
- SWIFT
- rxswift
- combine
- uiscrollview
- tableView
- UICollectionView
- Human interface guide
- MVVM
- 리팩토링
- ribs
- Observable
- ios
- 애니메이션
- uitableview
- 리펙토링
- Clean Code
- collectionview
- 클린 코드
- 리펙터링
- 스위프트
- RxCocoa
Archives
- Today
- Total
김종권의 iOS 앱 개발 알아가기
[iOS - swift] Storyboard에 UI 구현, 코드에서 초기화하여 화면전환 하는 방법 (UIStoryboard, instantiateViewController) 본문
iOS 실전 (swift)
[iOS - swift] Storyboard에 UI 구현, 코드에서 초기화하여 화면전환 하는 방법 (UIStoryboard, instantiateViewController)
jake-kim 2020. 11. 8. 23:29
Storyboard객체 참조를 얻어서, 그 안에서 ViewController를 생성
- "두 번째 화면"의 .swift구성
//
// VC2.swift
// TTTTT
//
// Created by 김종권 on 2020/11/08.
//
import Foundation
import UIKit
class VC2: UIViewController {
let storyboardName = "Main"
let storyboardID = "VC2"
}
- 다시, 스토리보드에서 Class와 Storyboard ID입력
- 첫 번째 ViewController에서 Storyboard를 가지고 화면 초기화
- storyboard객체를 storyboardName을 가지고 탐색
- storyboard안에 기입한 storyboardID를 가지고 ViewController 초기화
- storybaordName은 Storyboard파일 이름이며, storyboardID는 ViewController의 ID를 의미
//
// ViewController.swift
// TTTTT
//
// Created by 김종권 on 2020/11/08.
//
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func btnNext(_ sender: Any) {
let vc = VC2()
let storyboardName = vc.storyboardName
let storyboardID = vc.storyboardID
let storyboard = UIStoryboard(name: storyboardName, bundle: Bundle.main)
let viewController = storyboard.instantiateViewController(identifier: storyboardID)
present(viewController, animated: true)
}
}
MVVM에서의 Storyboard초기화 프로토콜
- 새로운 ViewController 클래스를 만들 때, 아래 프로토콜을 구현
- 화면 전환을 위해, 첫 번째 화면에서 두 번째 viewController를 생성할 때, VC2.instantiate(viewModel: vm)과 같이 초기화
protocol StoryboardInitializable {
associatedtype ViewModel
static var storyboardName: String { get set }
static var storyboardID: String { get set }
static func instantiate(viewModel: ViewModel) -> Self
var viewModel: ViewModel! { get set }
init?(coder: NSCoder, viewModel: ViewModel)
}
extension StoryboardInitializable where Self: UIViewController {
static func instantiate(viewModel: ViewModel) -> Self {
if #available(iOS 13.0, *) {
let storyboard = UIStoryboard(name: storyboardName, bundle: Bundle.main)
return storyboard.instantiateViewController(identifier: storyboardID) { (coder) -> Self? in
return Self(coder: coder, viewModel: viewModel)
}
} else {
let storyboard = UIStoryboard(name: storyboardName, bundle: Bundle.main)
var vc = storyboard.instantiateViewController(withIdentifier: storyboardID) as! Self
vc.viewModel = viewModel
return vc
}
}
}
'iOS 실전 (swift)' 카테고리의 다른 글
[iOS - swift] String에 strikeThrough 적용 (AttributedString) (0) | 2020.11.24 |
---|---|
[iOS - swift] container view 사용 방법: addChild, addSubViews, didMove, willMove, revmoveFromSuperview, removeFromParent (0) | 2020.11.20 |
[iOS - swift] MVVM패턴을 이용하여 toggle 로직 구현 (0) | 2020.11.01 |
[iOS - swift] 19. @propertyWrapper 이용하여 UserDefault쓰기 (0) | 2020.09.19 |
[iOS - swift] 17. for - where문 (0) | 2020.08.23 |
Comments