Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 22 additions & 4 deletions Smashing-Assignment/Extension/UITextField+.swift
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
//
// UITextField+.swift
// NewCombine
// Smashing-Assignment
//
// Created by JIN on 12/26/25.
// Created by 홍준범 on 12/26/25.
//

import Combine
import UIKit
import Combine

extension UITextField {
func textDidChangePublisher() -> AnyPublisher<String, Never> {
Expand All @@ -17,4 +17,22 @@ extension UITextField {
}
}


extension UITextField {
func addLeftPadding(_ width: CGFloat = 10) {
let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: width, height: self.frame.height))
self.leftView = paddingView
self.leftViewMode = ViewMode.always
}

func addRightPadding(_ width: CGFloat = 10) {
let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: width, height: self.frame.height))
self.rightView = paddingView
self.rightViewMode = ViewMode.always
}

/// 텍스트 필드에 좌우 패딩을 한 번에 추가합니다.
func addPadding(leftAmount: CGFloat = 10, rightAmount: CGFloat = 10) {
addLeftPadding(leftAmount)
addRightPadding(rightAmount)
}
}

This file was deleted.

3 changes: 2 additions & 1 deletion Smashing-Assignment/Presentation/Core/TabBarController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,8 @@ final class TabBarController: UITabBarController {
case .jinjae:
return JinJaeViewController()
case .junbeom:
return CombineViewController_HJB()
let HJBviewModel = CombineViewModel_HJB()
return CombineViewController_HJB(viewModel: HJBviewModel)
case .seungjun:
return UIViewController()
}
Expand Down
38 changes: 0 additions & 38 deletions Smashing-Assignment/Presentation/Core/UITextField+.swift

This file was deleted.

153 changes: 153 additions & 0 deletions Smashing-Assignment/Presentation/HJB/CombineViewController_HJB.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,153 @@
//
// Combine_HJB.swift
// Smashing-Assignment
//
// Created by 홍준범 on 12/26/25.
//

import UIKit
import Combine

import Then
import SnapKit

protocol InputOutputProtocol {

associatedtype Input
associatedtype Output

func transform(input: AnyPublisher<Input, Never>) -> AnyPublisher<Output, Never>
}

class CombineViewModel_HJB: InputOutputProtocol {

enum Input {
case firstTextFieldChanged(String)
case secondTextFieldChanged(String)
case buttonTapped
}

enum Output {
case toggleButton(isEnabled: Bool)
case clearTextFields
}

private let output: PassthroughSubject<Output, Never> = .init()
private var cancellables = Set<AnyCancellable>()

private let firstTextSubject = CurrentValueSubject<String, Never>("")
private let secondTextSubject = CurrentValueSubject<String, Never>("")

func transform(input: AnyPublisher<Input, Never>) -> AnyPublisher<Output, Never> {
input.sink { [weak self] event in
switch event {
case .firstTextFieldChanged(let text):
self?.firstTextSubject.send(text)
case .secondTextFieldChanged(let text):
self?.secondTextSubject.send(text)
case .buttonTapped:
self?.firstTextSubject.send("")
self?.secondTextSubject.send("")
self?.output.send(.clearTextFields)
}
}.store(in: &cancellables)

Publishers.CombineLatest(firstTextSubject, secondTextSubject)
.map { first, second in
return first.count >= 5 && second.count >= 5
}
.sink { [weak self] isEnabled in
self?.output.send(.toggleButton(isEnabled: isEnabled))
}.store(in: &cancellables)

return output.eraseToAnyPublisher()
}
}

class CombineViewController_HJB: UIViewController {
@Published var combineText: String = ""

// private let vm = CombineViewModel_HJB()
private let vm: CombineViewModel_HJB

private let input: PassthroughSubject<CombineViewModel_HJB.Input, Never> = .init()
private var cancellables = Set<AnyCancellable>()

private let homeView = CombineView_HJB()

init(viewModel: CombineViewModel_HJB) {
self.vm = viewModel
super.init(nibName: nil, bundle: nil)
}

required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}

override func loadView() {
self.view = homeView
}

override func viewDidLoad() {
super.viewDidLoad()

bind()
addTarget()
}

private func bind() {
homeView.combineTextField.textDidChangePublisher()
.sink { [weak self] text in
self?.input.send(.firstTextFieldChanged(text))
}.store(in: &cancellables)

homeView.secondCombineTextField.textDidChangePublisher()
.sink { [weak self] text in
self?.input.send(.secondTextFieldChanged(text))
}.store(in: &cancellables)

let output = vm.transform(input: input.eraseToAnyPublisher())

output
.receive(on: DispatchQueue.main) //이거 없애서 해보기
.sink { [weak self] event in
switch event {
case .toggleButton(let isEnabled):
self?.homeView.combineButton.isEnabled = isEnabled
self?.homeView.combineButton.backgroundColor = isEnabled ? .systemBlue : .gray
case .clearTextFields:
self?.homeView.combineTextField.text = ""
self?.homeView.secondCombineTextField.text = ""
}
}.store(in: &cancellables)
}

private func addTarget() {
homeView.combineButton.addTarget(self, action: #selector(combineButtonTapped), for: .touchUpInside)
}

@objc
private func combineButtonTapped(_ sender: UIButton) {
input.send(.buttonTapped)
}
}

// private func bind() {
// homeView.combineTextField.textDidChangePublisher()
// .assign(to: &$combineText)
//
// $combineText
// .sink { [weak self] text in
// if text.count >= 5 {
// self?.homeView.combineButton.isEnabled = true
// self?.homeView.combineButton.backgroundColor = .systemBlue
// self?.homeView.infoText.isHidden = true
//
// } else {
// self?.homeView.combineButton.isEnabled = false
// self?.homeView.combineButton.backgroundColor = .gray
// self?.homeView.infoText.isHidden = false
// }
// }
// .store(in: &cancellables)
// }
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,23 @@ final class CombineView_HJB: UIView {
$0.addPadding()
}

var secondCombineTextField = UITextField().then {
$0.placeholder = "Combine2"
$0.layer.borderWidth = 1
$0.layer.borderColor = UIColor.gray.cgColor
$0.addPadding()
}

var infoText = UILabel().then {
$0.text = "5글자 이상 입력해주세요"
$0.text = "두개의 텍스트 박스에 모두 5글자 이상 입력 시 삭제 가능"
$0.textAlignment = .center
}

var combineButton = UIButton().then {
$0.setTitle("Next", for: .normal)
$0.setTitleColor(.black, for: .normal)
$0.layer.cornerRadius = 8
$0.backgroundColor = .gray
}

override init(frame: CGRect) {
Expand All @@ -41,6 +49,7 @@ final class CombineView_HJB: UIView {

private func setUI() {
addSubview(combineTextField)
addSubview(secondCombineTextField)
addSubview(infoText)
addSubview(combineButton)
}
Expand All @@ -53,9 +62,16 @@ final class CombineView_HJB: UIView {
$0.leading.trailing.equalToSuperview().inset(40)
}

infoText.snp.makeConstraints {
secondCombineTextField.snp.makeConstraints {
$0.centerX.equalToSuperview()
$0.top.equalTo(combineTextField.snp.bottom).offset(20)
$0.height.equalTo(50)
$0.leading.trailing.equalToSuperview().inset(40)
}

infoText.snp.makeConstraints {
$0.centerX.equalToSuperview()
$0.top.equalTo(secondCombineTextField.snp.bottom).offset(20)
}

combineButton.snp.makeConstraints {
Expand Down