From 982968434e650af0ea32dbe1ed1153c5fd9e93c9 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Fri, 19 Apr 2024 15:44:13 +0900 Subject: [PATCH 1/4] fix: wip --- .../View/ShareExtensionBackGroundView.swift | 2 +- iBox/Sources/Extension/UIView+Extension.swift | 10 +++ .../UIViewController+Extension.swift | 1 + iBox/Sources/Favorite/FavoriteView.swift | 19 +++--- .../Favorite/FavoriteViewController.swift | 33 ++++++++++ iBox/Sources/Web/ErrorPageView.swift | 61 +++++++++++++++++++ .../Sources/Web/ErrorPageViewController.swift | 34 +++++++++++ iBox/Sources/Web/WebView.swift | 1 + iBox/Sources/Web/WebViewController.swift | 2 +- 9 files changed, 150 insertions(+), 13 deletions(-) create mode 100644 iBox/Sources/Web/ErrorPageView.swift create mode 100644 iBox/Sources/Web/ErrorPageViewController.swift diff --git a/ShareExtension/Sources/View/ShareExtensionBackGroundView.swift b/ShareExtension/Sources/View/ShareExtensionBackGroundView.swift index 8fd1643..ae57b3c 100644 --- a/ShareExtension/Sources/View/ShareExtensionBackGroundView.swift +++ b/ShareExtension/Sources/View/ShareExtensionBackGroundView.swift @@ -67,7 +67,7 @@ class ShareExtensionBackGroundView: UIView { let button = UIButton(type: .system) button.setImage(UIImage(systemName: "arrow.up.forward.square"), for: .normal) button.setTitle("앱으로 담아가기", for: .normal) - button.setTitleColor(.black, for: .normal) + button.setTitleColor(.label, for: .normal) button.setBackgroundColor(.clear, for: .normal) button.setTitle("앱이 실행됩니다", for: .highlighted) diff --git a/iBox/Sources/Extension/UIView+Extension.swift b/iBox/Sources/Extension/UIView+Extension.swift index 77e401b..890082d 100644 --- a/iBox/Sources/Extension/UIView+Extension.swift +++ b/iBox/Sources/Extension/UIView+Extension.swift @@ -30,4 +30,14 @@ extension UIView { } } + // MARK: - 뷰 계층 구조 log + func printViewHierarchy(level: Int = 0) { + let padding = String(repeating: " ", count: level * 2) + let viewInfo = "\(padding)\(type(of: self)) - Frame: \(self.frame)" + print(viewInfo) + + for subview in self.subviews { + subview.printViewHierarchy(level: level + 1) + } + } } diff --git a/iBox/Sources/Extension/UIViewController+Extension.swift b/iBox/Sources/Extension/UIViewController+Extension.swift index 51b6343..6e7a9f5 100644 --- a/iBox/Sources/Extension/UIViewController+Extension.swift +++ b/iBox/Sources/Extension/UIViewController+Extension.swift @@ -26,4 +26,5 @@ extension UIViewController { } return false } + } diff --git a/iBox/Sources/Favorite/FavoriteView.swift b/iBox/Sources/Favorite/FavoriteView.swift index 0963419..0fdaf5e 100644 --- a/iBox/Sources/Favorite/FavoriteView.swift +++ b/iBox/Sources/Favorite/FavoriteView.swift @@ -6,18 +6,18 @@ // import UIKit -import WebKit - import SnapKit class FavoriteView: UIView { - lazy var webView = { - if WebViewPreloader.shared.getFavoriteView() == nil { + var webView: WebView { + if let view = WebViewPreloader.shared.getFavoriteView() { + return view + } else { loadFavoriteWeb() + return WebViewPreloader.shared.getFavoriteView()! } - return WebViewPreloader.shared.getFavoriteView() - }() + } // MARK: - Initializer @@ -34,7 +34,7 @@ class FavoriteView: UIView { override func layoutSubviews() { super.layoutSubviews() - webView?.setupRefreshControl() + webView.setupRefreshControl() } // MARK: - Setup Methods @@ -44,12 +44,10 @@ class FavoriteView: UIView { } private func setupHierarchy() { - guard let webView else { return } addSubview(webView) } private func setupLayout() { - guard let webView else { return } webView.snp.makeConstraints { make in make.edges.equalToSuperview() } @@ -58,7 +56,7 @@ class FavoriteView: UIView { private func loadFavoriteWeb() { let favoriteId = UserDefaultsManager.favoriteId var favoriteUrl: URL? = nil - if let favoriteId { + if let favoriteId = favoriteId { favoriteUrl = CoreDataManager.shared.getBookmarkUrl(favoriteId) if favoriteUrl == nil { UserDefaultsManager.favoriteId = nil @@ -66,5 +64,4 @@ class FavoriteView: UIView { } WebViewPreloader.shared.preloadFavoriteView(url: favoriteUrl) } - } diff --git a/iBox/Sources/Favorite/FavoriteViewController.swift b/iBox/Sources/Favorite/FavoriteViewController.swift index 7d2e018..1c897be 100644 --- a/iBox/Sources/Favorite/FavoriteViewController.swift +++ b/iBox/Sources/Favorite/FavoriteViewController.swift @@ -8,12 +8,31 @@ import UIKit class FavoriteViewController: BaseViewController, BaseViewControllerProtocol { + + var selectedWebsite: URL? // MARK: - Life Cycle override func viewDidLoad() { super.viewDidLoad() + setupNavigationBar() + view.backgroundColor = .backgroundColor + + // contentView가 FavoriteView 인스턴스인 경우, WebView의 delegate 설정 + if let favoriteView = self.view as? FavoriteView { + // WebViewPreloader를 통해 가져온 WebView의 delegate를 이 ViewController로 설정 + let webView = favoriteView.webView + webView.delegate = self + webView.selectedWebsite = selectedWebsite // 웹 사이트 설정 + } + } + + override func viewDidLayoutSubviews() { + super.viewDidLayoutSubviews() + if let favoriteView = self.view as? FavoriteView { + favoriteView.webView.setupRefreshControl() + } } // MARK: - BaseViewControllerProtocol @@ -23,3 +42,17 @@ class FavoriteViewController: BaseViewController, BaseViewControll } } + +extension FavoriteViewController: WebViewDelegate { + + func pushAddBookMarkViewController(url: URL) { + let encodingURL = url.absoluteString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? "" + + if let iBoxUrl = URL(string: "iBox://url?data=" + encodingURL) { + if let tabBarController = findMainTabBarController() { + AddBookmarkManager.shared.navigateToAddBookmarkView(from: iBoxUrl, in: tabBarController) + } + } + } + +} diff --git a/iBox/Sources/Web/ErrorPageView.swift b/iBox/Sources/Web/ErrorPageView.swift new file mode 100644 index 0000000..ef395ac --- /dev/null +++ b/iBox/Sources/Web/ErrorPageView.swift @@ -0,0 +1,61 @@ +// +// ErrorPageView.swift +// iBox +// +// Created by Chan on 4/18/24. +// + +import UIKit + +import SnapKit + +class ErrorPageView: UIView { + + let messageLabel = UILabel() + let retryButton = UIButton() + + override init(frame: CGRect) { + super.init(frame: frame) + setupViews() + setupLayout() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + private func setupViews() { + backgroundColor = .red + + messageLabel.textAlignment = .center + messageLabel.numberOfLines = 0 + + retryButton.setTitle("Retry", for: .normal) + retryButton.backgroundColor = .systemBlue + retryButton.setTitleColor(.white, for: .normal) + retryButton.layer.cornerRadius = 10 + + addSubview(messageLabel) + addSubview(retryButton) + } + + private func setupLayout() { + messageLabel.snp.makeConstraints { make in + make.centerX.equalToSuperview() + make.centerY.equalToSuperview() + make.leading.greaterThanOrEqualToSuperview().offset(20) + make.trailing.lessThanOrEqualToSuperview().offset(-20) + } + + retryButton.snp.makeConstraints { make in + make.top.equalTo(messageLabel.snp.bottom).offset(20) + make.centerX.equalToSuperview() + make.width.equalTo(100) + make.height.equalTo(44) + } + } + + func configure(with error: Error, url: URL) { + messageLabel.text = "Failed to load \(url.absoluteString): \(error.localizedDescription)" + } +} diff --git a/iBox/Sources/Web/ErrorPageViewController.swift b/iBox/Sources/Web/ErrorPageViewController.swift new file mode 100644 index 0000000..bea7ac1 --- /dev/null +++ b/iBox/Sources/Web/ErrorPageViewController.swift @@ -0,0 +1,34 @@ +// +// ErrorPageViewController.swift +// iBox +// +// Created by Chan on 4/18/24. +// + +import UIKit + +class ErrorPageViewController: UIViewController { + + override func loadView() { + self.view = ErrorPageView() + } + + override func viewDidLoad() { + super.viewDidLoad() + if let errorPageView = view as? ErrorPageView { + errorPageView.retryButton.addTarget(self, action: #selector(retryButtonTapped), for: .touchUpInside) + } + } + + func configureWithError(_ error: Error, url: URL) { + if let errorPageView = view as? ErrorPageView { + errorPageView.configure(with: error, url: url) + } + } + + @objc private func retryButtonTapped() { + dismiss(animated: true, completion: { + // 재시도 로직 구현 + }) + } +} diff --git a/iBox/Sources/Web/WebView.swift b/iBox/Sources/Web/WebView.swift index 0572dc6..58f9033 100644 --- a/iBox/Sources/Web/WebView.swift +++ b/iBox/Sources/Web/WebView.swift @@ -173,6 +173,7 @@ extension WebView: WKNavigationDelegate { } + extension WebView: UIScrollViewDelegate { func scrollViewDidScroll(_ scrollView: UIScrollView) { diff --git a/iBox/Sources/Web/WebViewController.swift b/iBox/Sources/Web/WebViewController.swift index 4c09737..5da41a1 100644 --- a/iBox/Sources/Web/WebViewController.swift +++ b/iBox/Sources/Web/WebViewController.swift @@ -27,6 +27,7 @@ class WebViewController: BaseViewController, BaseViewControllerProtocol guard let contentView = contentView as? WebView else { return } contentView.delegate = self contentView.selectedWebsite = selectedWebsite + } override func viewDidLayoutSubviews() { @@ -53,7 +54,6 @@ extension WebViewController: WebViewDelegate { AddBookmarkManager.shared.navigateToAddBookmarkView(from: iBoxUrl, in: tabBarController) } } - } } From 32a0a5f3d6021d0b17e25aa7a840e1db5b3e7eac Mon Sep 17 00:00:00 2001 From: chanhihi Date: Sun, 21 Apr 2024 18:35:18 +0900 Subject: [PATCH 2/4] feat: set delegate simply --- iBox/Sources/Favorite/FavoriteView.swift | 19 ++++++++------- .../Favorite/FavoriteViewController.swift | 24 +++++++------------ 2 files changed, 19 insertions(+), 24 deletions(-) diff --git a/iBox/Sources/Favorite/FavoriteView.swift b/iBox/Sources/Favorite/FavoriteView.swift index 0fdaf5e..0963419 100644 --- a/iBox/Sources/Favorite/FavoriteView.swift +++ b/iBox/Sources/Favorite/FavoriteView.swift @@ -6,18 +6,18 @@ // import UIKit +import WebKit + import SnapKit class FavoriteView: UIView { - var webView: WebView { - if let view = WebViewPreloader.shared.getFavoriteView() { - return view - } else { + lazy var webView = { + if WebViewPreloader.shared.getFavoriteView() == nil { loadFavoriteWeb() - return WebViewPreloader.shared.getFavoriteView()! } - } + return WebViewPreloader.shared.getFavoriteView() + }() // MARK: - Initializer @@ -34,7 +34,7 @@ class FavoriteView: UIView { override func layoutSubviews() { super.layoutSubviews() - webView.setupRefreshControl() + webView?.setupRefreshControl() } // MARK: - Setup Methods @@ -44,10 +44,12 @@ class FavoriteView: UIView { } private func setupHierarchy() { + guard let webView else { return } addSubview(webView) } private func setupLayout() { + guard let webView else { return } webView.snp.makeConstraints { make in make.edges.equalToSuperview() } @@ -56,7 +58,7 @@ class FavoriteView: UIView { private func loadFavoriteWeb() { let favoriteId = UserDefaultsManager.favoriteId var favoriteUrl: URL? = nil - if let favoriteId = favoriteId { + if let favoriteId { favoriteUrl = CoreDataManager.shared.getBookmarkUrl(favoriteId) if favoriteUrl == nil { UserDefaultsManager.favoriteId = nil @@ -64,4 +66,5 @@ class FavoriteView: UIView { } WebViewPreloader.shared.preloadFavoriteView(url: favoriteUrl) } + } diff --git a/iBox/Sources/Favorite/FavoriteViewController.swift b/iBox/Sources/Favorite/FavoriteViewController.swift index 1c897be..41ce1e8 100644 --- a/iBox/Sources/Favorite/FavoriteViewController.swift +++ b/iBox/Sources/Favorite/FavoriteViewController.swift @@ -8,31 +8,23 @@ import UIKit class FavoriteViewController: BaseViewController, BaseViewControllerProtocol { - - var selectedWebsite: URL? + var delegate: AddBookmarkViewControllerProtocol? + // MARK: - Life Cycle override func viewDidLoad() { super.viewDidLoad() - setupNavigationBar() - view.backgroundColor = .backgroundColor - - // contentView가 FavoriteView 인스턴스인 경우, WebView의 delegate 설정 - if let favoriteView = self.view as? FavoriteView { - // WebViewPreloader를 통해 가져온 WebView의 delegate를 이 ViewController로 설정 - let webView = favoriteView.webView - webView.delegate = self - webView.selectedWebsite = selectedWebsite // 웹 사이트 설정 - } + + guard let contentView = contentView as? FavoriteView else { return } + contentView.webView?.delegate = self } - + override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() - if let favoriteView = self.view as? FavoriteView { - favoriteView.webView.setupRefreshControl() - } + guard let contentView = contentView as? FavoriteView else { return } + contentView.webView?.setupRefreshControl() } // MARK: - BaseViewControllerProtocol From 8e8f2cd7a189a63d28372ad57a953df120158cc3 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Sun, 21 Apr 2024 18:37:12 +0900 Subject: [PATCH 3/4] chore: style --- iBox/Sources/Web/WebView.swift | 1 - iBox/Sources/Web/WebViewController.swift | 1 - 2 files changed, 2 deletions(-) diff --git a/iBox/Sources/Web/WebView.swift b/iBox/Sources/Web/WebView.swift index 58f9033..0572dc6 100644 --- a/iBox/Sources/Web/WebView.swift +++ b/iBox/Sources/Web/WebView.swift @@ -173,7 +173,6 @@ extension WebView: WKNavigationDelegate { } - extension WebView: UIScrollViewDelegate { func scrollViewDidScroll(_ scrollView: UIScrollView) { diff --git a/iBox/Sources/Web/WebViewController.swift b/iBox/Sources/Web/WebViewController.swift index 5da41a1..86a6831 100644 --- a/iBox/Sources/Web/WebViewController.swift +++ b/iBox/Sources/Web/WebViewController.swift @@ -27,7 +27,6 @@ class WebViewController: BaseViewController, BaseViewControllerProtocol guard let contentView = contentView as? WebView else { return } contentView.delegate = self contentView.selectedWebsite = selectedWebsite - } override func viewDidLayoutSubviews() { From 59abcab6729f097632da907818eb3f4cb1d75158 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Sun, 21 Apr 2024 18:40:18 +0900 Subject: [PATCH 4/4] chore: delete files --- iBox/Sources/Web/ErrorPageView.swift | 61 ------------------- .../Sources/Web/ErrorPageViewController.swift | 34 ----------- 2 files changed, 95 deletions(-) delete mode 100644 iBox/Sources/Web/ErrorPageView.swift delete mode 100644 iBox/Sources/Web/ErrorPageViewController.swift diff --git a/iBox/Sources/Web/ErrorPageView.swift b/iBox/Sources/Web/ErrorPageView.swift deleted file mode 100644 index ef395ac..0000000 --- a/iBox/Sources/Web/ErrorPageView.swift +++ /dev/null @@ -1,61 +0,0 @@ -// -// ErrorPageView.swift -// iBox -// -// Created by Chan on 4/18/24. -// - -import UIKit - -import SnapKit - -class ErrorPageView: UIView { - - let messageLabel = UILabel() - let retryButton = UIButton() - - override init(frame: CGRect) { - super.init(frame: frame) - setupViews() - setupLayout() - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - private func setupViews() { - backgroundColor = .red - - messageLabel.textAlignment = .center - messageLabel.numberOfLines = 0 - - retryButton.setTitle("Retry", for: .normal) - retryButton.backgroundColor = .systemBlue - retryButton.setTitleColor(.white, for: .normal) - retryButton.layer.cornerRadius = 10 - - addSubview(messageLabel) - addSubview(retryButton) - } - - private func setupLayout() { - messageLabel.snp.makeConstraints { make in - make.centerX.equalToSuperview() - make.centerY.equalToSuperview() - make.leading.greaterThanOrEqualToSuperview().offset(20) - make.trailing.lessThanOrEqualToSuperview().offset(-20) - } - - retryButton.snp.makeConstraints { make in - make.top.equalTo(messageLabel.snp.bottom).offset(20) - make.centerX.equalToSuperview() - make.width.equalTo(100) - make.height.equalTo(44) - } - } - - func configure(with error: Error, url: URL) { - messageLabel.text = "Failed to load \(url.absoluteString): \(error.localizedDescription)" - } -} diff --git a/iBox/Sources/Web/ErrorPageViewController.swift b/iBox/Sources/Web/ErrorPageViewController.swift deleted file mode 100644 index bea7ac1..0000000 --- a/iBox/Sources/Web/ErrorPageViewController.swift +++ /dev/null @@ -1,34 +0,0 @@ -// -// ErrorPageViewController.swift -// iBox -// -// Created by Chan on 4/18/24. -// - -import UIKit - -class ErrorPageViewController: UIViewController { - - override func loadView() { - self.view = ErrorPageView() - } - - override func viewDidLoad() { - super.viewDidLoad() - if let errorPageView = view as? ErrorPageView { - errorPageView.retryButton.addTarget(self, action: #selector(retryButtonTapped), for: .touchUpInside) - } - } - - func configureWithError(_ error: Error, url: URL) { - if let errorPageView = view as? ErrorPageView { - errorPageView.configure(with: error, url: url) - } - } - - @objc private func retryButtonTapped() { - dismiss(animated: true, completion: { - // 재시도 로직 구현 - }) - } -}