Skip to content

Commit e14bd85

Browse files
authored
Merge pull request #4 from keeplo/develop
[Release] v0.3.0
2 parents e9148f8 + 78173f1 commit e14bd85

9 files changed

Lines changed: 134 additions & 143 deletions

File tree

Example/Example/SceneDelegate.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate {
2626
}()
2727

2828
navigationController.viewControllers = [
29-
FirstView(viewModel: FirstViewModel()).viewController,
29+
FirstView(stateView: .init()).viewController,
3030
NumberingView(viewModel: .init()).viewController,
3131
NumberingView(viewModel: .init()).viewController
3232
]

Example/Example/View/ContentView.swift

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,36 +9,32 @@ import ControllerableViewModel
99

1010
import SwiftUI
1111

12-
final class FirstViewModel: NavigationableViewModel {
13-
14-
}
15-
1612
struct FirstView: ControllerableView {
1713

18-
@ObservedObject var viewModel: FirstViewModel
14+
var stateView: StateView
1915

2016
var body: some View {
2117
VStack(spacing: 30) {
2218
Button(action: {
23-
viewModel.push(view: NumberingView(viewModel: .init()))
19+
self.push(view: NumberingView(viewModel: .init()))
2420
}) {
2521
Text("Push")
2622
}
2723

2824
Button(action: {
29-
viewModel.present(view: NumberingView(viewModel: .init()))
25+
self.present(view: NumberingView(viewModel: .init()))
3026
}) {
3127
Text("Default Present")
3228
}
3329

3430
Button(action: {
35-
viewModel.present(view: NumberingView(viewModel: .init()), to: .fullScreen, by: .coverVertical)
31+
self.present(view: NumberingView(viewModel: .init()), to: .fullScreen, by: .coverVertical)
3632
}) {
3733
Text("Full Screen")
3834
}
3935

4036
Button(action: {
41-
viewModel.present(view: NumberingView(viewModel: .init()), to: .custom, by: .coverVertical, with: [.large(), .medium()])
37+
self.present(view: NumberingView(viewModel: .init()), to: .custom, by: .coverVertical, with: [.large(), .medium()])
4238
}) {
4339
Text("Changable Modal")
4440
}

Example/Example/View/CustomAlertView.swift

Lines changed: 10 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -9,28 +9,16 @@ import ControllerableViewModel
99

1010
import SwiftUI
1111

12-
final class CustomeAlertViewModel: NavigationableViewModel {
13-
14-
struct Item {
15-
let title: String
16-
let message: String
17-
let completion: () -> Void
18-
}
19-
20-
let item: Item
21-
22-
init(item: Item) {
23-
self.item = item
24-
}
25-
26-
var title: String { item.title }
27-
var message: String { item.message }
28-
var completion: () -> Void { return item.completion }
12+
struct AlertItem {
13+
let title: String
14+
let message: String
15+
let completion: () -> Void
2916
}
3017

3118
struct CustomAlert: ControllerableView {
3219

33-
@ObservedObject var viewModel: CustomeAlertViewModel
20+
var stateView: StateView
21+
let item : AlertItem
3422

3523
var body: some View {
3624
ZStack {
@@ -39,19 +27,19 @@ struct CustomAlert: ControllerableView {
3927
.ignoresSafeArea(.all)
4028
VStack(alignment: .center, spacing: 0) {
4129
Spacer()
42-
Text(viewModel.title)
30+
Text(item.title)
4331
Spacer()
4432
.frame(height: 11)
45-
Text(viewModel.message)
33+
Text(item.message)
4634
.foregroundColor(.gray)
4735
Spacer()
4836
Divider()
4937
.padding(0)
5038
Spacer()
5139
Button(
5240
action: {
53-
viewModel.dismiss()
54-
viewModel.completion()
41+
self.dismiss()
42+
item.completion()
5543
}, label: {
5644
HStack {
5745
Spacer()

Example/Example/View/NumberingView.swift

Lines changed: 23 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,14 @@ import ControllerableViewModel
99

1010
import SwiftUI
1111

12-
final class NumberingViewModel: NavigationableViewModel {
12+
final class NumberingViewModel: ObservableObject {
1313
static var number: Int = 0
1414

1515
let number: Int
1616

17-
override init() {
17+
init() {
1818
self.number = Self.number
19-
20-
super.init()
21-
19+
2220
Self.number += 1
2321

2422
print("init \(number)")
@@ -32,6 +30,8 @@ final class NumberingViewModel: NavigationableViewModel {
3230

3331
struct NumberingView: ControllerableView {
3432

33+
var stateView: StateView = .init()
34+
3535
@ObservedObject var viewModel: NumberingViewModel
3636

3737
var body: some View {
@@ -40,67 +40,65 @@ struct NumberingView: ControllerableView {
4040
Text("Number \(viewModel.number)")
4141

4242
Button(action: {
43-
viewModel.push(view: NumberingView(viewModel: .init()))
43+
self.push(view: NumberingView(viewModel: .init()))
4444
}) {
4545
Text("push")
4646
}
4747

4848
Button(action: {
49-
viewModel.present(view: NumberingView(viewModel: .init()))
49+
self.present(view: NumberingView(viewModel: .init()))
5050
}) {
5151
Text("Default Present")
5252
}
5353

5454
Button(action: {
55-
viewModel.present(view: NumberingView(viewModel: .init()), to: .fullScreen, by: .coverVertical)
55+
self.present(view: NumberingView(viewModel: .init()), to: .fullScreen, by: .coverVertical)
5656
}) {
5757
Text("Full Screen")
5858
}
5959

6060
Button(action: {
61-
viewModel.present(view: NumberingView(viewModel: .init()), to: .custom, by: .coverVertical, with: [.large(), .medium()])
61+
self.present(view: NumberingView(viewModel: .init()), to: .custom, by: .coverVertical, with: [.large(), .medium()])
6262
}) {
6363
Text("Changable Modal")
6464
}
6565

6666
Button(action: {
67-
viewModel.dismiss()
67+
self.dismiss()
6868
}) {
6969
Text("dismiss")
7070
}
7171

7272
Button(action: {
73-
viewModel.pop()
73+
self.pop()
7474
}) {
7575
Text("pop")
7676
}
7777

7878
Button(action: {
79-
viewModel.popToRoot()
79+
self.popToRoot()
8080
}) {
8181
Text("pop to root")
8282
}
8383

8484
Button(action: {
85-
viewModel.popToRoot()
86-
viewModel.push(view: NumberingView(viewModel: .init()))
87-
viewModel.push(view: NumberingView(viewModel: .init()))
85+
self.popToRoot()
86+
self.push(view: NumberingView(viewModel: .init()))
87+
self.push(view: NumberingView(viewModel: .init()))
8888
}) {
8989
Text("reStacks")
9090
}
9191

9292
Button(action: {
93-
let viewModel = CustomeAlertViewModel(
94-
item: .init(
95-
title: "SwiftUI 로 구현된 Alert 예제",
96-
message: "UIKit 으로도 구현가능\n여기는 View Number \(viewModel.number)",
97-
completion: {
98-
print("얼럿 Completion")
99-
}
100-
)
93+
let alertItem = AlertItem(
94+
title: "SwiftUI 로 구현된 Alert 예제",
95+
message: "UIKit 으로도 구현가능\n여기는 View Number \(viewModel.number)",
96+
completion: {
97+
print("얼럿 Completion")
98+
}
10199
)
102-
let view = CustomAlert(viewModel: viewModel)
103-
viewModel.alert(view: view)
100+
let view = CustomAlert(stateView: .init(), item: alertItem)
101+
self.presentAlert(view: view)
104102
}) {
105103
Text("alert")
106104
}

Sources/ControllerableViewModel/NavigationableViewModel.swift renamed to Sources/ControllerableViewModel/ControllerableView+Extension.swift

Lines changed: 29 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,38 @@
11
//
2-
// NavigationableViewModel.swift
2+
// File.swift
3+
//
34
//
4-
//
5-
// Created by 김용우 on 2023/10/17.
5+
// Created by 김용우 on 2023/10/19.
66
//
77

88
import SwiftUI
99

10-
open class NavigationableViewModel: ObservableObject {
11-
public weak var viewController: UIViewController?
10+
public extension ControllerableView {
1211

13-
public init() {}
14-
}
15-
16-
// MARK: - Navigation
17-
@MainActor
18-
extension NavigationableViewModel {
12+
var viewController: UIViewController {
13+
let viewController = HostingController(rootView: self)
14+
self.stateView.viewController = viewController
15+
return viewController
16+
}
17+
18+
// MARK: ViewController Life Cycle
19+
func loadView() {}
20+
func viewDidLoad() {}
21+
func viewWillAppear() {}
22+
func viewDidAppear() {}
23+
func viewWillDisappear() {}
24+
func viewDidDisappear() {}
1925

20-
public func push(view: some ControllerableView) {
21-
viewController?.navigationController?.pushViewController(view.viewController, animated: true)
26+
// MARK: Navigation
27+
func push(view: some ControllerableView) {
28+
stateView.viewController?.navigationController?.pushViewController(view.viewController, animated: true)
2229
}
2330

24-
public func pop() {
25-
guard let currentViewController = viewController,
26-
let navigationController = currentViewController.navigationController else { return }
27-
guard navigationController.topViewController == currentViewController else { return }
28-
29-
navigationController.popViewController(animated: true)
31+
func pop() {
32+
stateView.viewController?.navigationController?.popViewController(animated: true)
3033
}
3134

32-
public func present(
35+
func present(
3336
view: some ControllerableView,
3437
to presentationStyle: UIModalPresentationStyle? = nil,
3538
by transitionStyle: UIModalTransitionStyle? = nil,
@@ -50,22 +53,17 @@ extension NavigationableViewModel {
5053
let presentingViewController = UINavigationController(rootViewController: nextViewController)
5154
presentingViewController.setNavigationBarHidden(true, animated: false)
5255

53-
viewController?.present(presentingViewController, animated: true)
56+
stateView.viewController?.present(presentingViewController, animated: true)
5457
}
5558

56-
public func dismiss() {
57-
viewController?.dismiss(animated: true)
59+
func dismiss() {
60+
stateView.viewController?.dismiss(animated: true)
5861
}
5962

60-
public func popToRoot() {
61-
viewController?.navigationController?.popToRootViewController(animated: true)
63+
func popToRoot() {
64+
stateView.viewController?.navigationController?.popToRootViewController(animated: true)
6265
}
6366

64-
}
65-
66-
@MainActor
67-
extension NavigationableViewModel {
68-
6967
private var window: UIWindow? {
7068
if #available(iOS 16.0, *) {
7169
return UIApplication.shared.connectedScenes
@@ -77,7 +75,7 @@ extension NavigationableViewModel {
7775
}
7876
}
7977

80-
public func alert(
78+
func presentAlert(
8179
view: some ControllerableView,
8280
to presentationStyle: UIModalPresentationStyle? = .overFullScreen,
8381
by transitionStyle: UIModalTransitionStyle? = .crossDissolve
@@ -101,5 +99,4 @@ extension NavigationableViewModel {
10199

102100
rootViewController.present(nextViewController, animated: true)
103101
}
104-
105102
}

0 commit comments

Comments
 (0)