-
Notifications
You must be signed in to change notification settings - Fork 1
Clody_iOS_Coding Template
김나연 edited this page Jul 4, 2024
·
4 revisions
import UIKit
import RxCocoa
import RxSwift
import Then
final class [Name]ViewController: UIViewController {
// MARK: - Properties
private let viewModel = [Name]ViewModel()
private let disposeBag = DisposeBag()
// MARK: - UI Components
private let rootView = [Name]View()
// MARK: - Life Cycles
override func loadView() {
super.loadView()
view = rootView
}
override func viewDidLoad() {
super.viewDidLoad()
bindViewModel()
setUI()
setDelegate()
setAddTarget()
}
}
// MARK: - Extensions
private extension SaveCompleteViewController {
func bindViewModel() {
/// 예시입니다. 참고한 후 삭제해주세요.
let input = LoginViewModel.Input(
appleLoginButtonTapEvent: appleLoginButton.rx.tap.asSignal(),
kakaoLoginButtonTapEvent: kakaoLoginButton.rx.tap.asSignal()
)
let output = viewModel.transform(from: input, disposeBag: disposeBag)
output.pushViewController
.drive(onNext: { [weak self] in
self?.navigationController?.pushViewController(UIViewController(), animated: true)
})
.disposed(by: disposeBag)
}
func setUI() { // 탭바, 내비바, 그외 ...
}
func setDelegate() {
}
func setAddTarget() {
}
// MARK: - Actions
@objc
func buttonDidTap() {
/// 필요 없으면 함수와 마크주석을 삭제해주세요.
}
}
import UIKit
import SnapKit
class BaseView: UIView {
override init(frame: CGRect) {
super.init(frame: frame)
setUI()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
final func setUI() {
setStyle()
setHierarchy()
setLayout()
}
/// View의 Style을 set 합니다.
func setStyle() {}
/// View의 Hierarchy를 set 합니다.
func setHierarchy() {}
/// View의 Layout을 set 합니다.
func setLayout() {}
}
import UIKit
import SnapKit
final class [Name]CollectionViewCell: UICollectionViewCell {
// TODO: 여기를 삭제하고 UI 컴포넌트를 생성하세요.
override init(frame: CGRect) {
super.init(frame: frame)
setStyle()
setHierarchy()
setLayout()
}
@available(*, unavailable)
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func setStyle() {
}
func setHierarchy() {
contentView.addSubviews()
}
func setLayout() {
}
}
extension [Name]CollectionViewCell {
func configure() {
}
}
import UIKit
import RxSwift
protocol ViewModelType {
associatedtype Input
associatedtype Output
func transform(from input: Input, disposeBag: RxSwift.DisposeBag) -> Output
}
final class [Name]ViewModel: ViewModelType {
struct Input {
let appleLoginButtonTapEvent: Signal<Void>
let kakaoLoginButtonTapEvent: Signal<Void>
}
struct Output {
let pushViewController: Driver<Void>
}
func transform(from input: Input, disposeBag: DisposeBag) -> Output {
/// 예시입니다. 참고한 후 삭제해주세요.
let pushViewController = BehaviorRelay<Void>
.merge(
input.appleLoginButtonTapEvent.asObservable(),
input.kakaoLoginButtonTapEvent.asObservable()
)
.asDriver(onErrorJustReturn: Void())
return Output(pushViewController: pushViewController)
}
}
- 폴더링
├── Application
│ ├── Appdelegate
│ └── SceneDelegate
├── Global
│ ├── Extensions
│ ├── Literals
│ │ ├── Literal
│ │ └──String
│ ├── Protocols
│ ├── Resources
│ │ ├── Font
│ │ ├── Assets
│ │ └── Info.plist
│ └── SupportingFiles
│ └── Base
│ └── LaunchScreen
├── Network
│ ├── Base
│ │ ├── BaseTargetType.swift
│ │ ├── GeneralResponse.swift
│ │ └── ... (기본 네트워크 세팅 파일)
│ ├── Environment
│ │ └── Config
│ ├── MoyaTarget
│ └── Service
└── Presentation
├── Common
│ ├── Base
│ └── Component
└── Home
├── ViewControllers
├── Views
├── Models
├── ViewModels
└── Cells