From 621d3aa74294a0bf3ddabde1ba9820e5aa74e646 Mon Sep 17 00:00:00 2001 From: Jacob Boyd Date: Wed, 3 Jul 2019 13:48:32 -0400 Subject: [PATCH 1/5] Added OfflineViewController, copying current offline page --- Cartfile.resolved | 2 +- DEV-Simple.xcodeproj/project.pbxproj | 24 +++ .../DEV-Rainbow.imageset/Contents.json | 21 +++ .../DEV-Rainbow.imageset/DEV-Rainbow.png | Bin 0 -> 45417 bytes DEV-Simple/core/AppDelegate.swift | 2 +- .../storyboards/Base.lproj/Main.storyboard | 147 ++++++++++++++++++ DEV-Simple/views/DEVCanvasView.swift | 47 ++++++ DEV-Simple/views/OfflineViewController.swift | 72 +++++++++ .../DEVColorCollectionViewCell.swift | 34 ++++ .../DEVColorCollectionViewCell.xib | 25 +++ DEV-Simple/views/ViewController.swift | 14 +- 11 files changed, 379 insertions(+), 9 deletions(-) create mode 100644 DEV-Simple/assets/Assets.xcassets/DEV-Rainbow.imageset/Contents.json create mode 100644 DEV-Simple/assets/Assets.xcassets/DEV-Rainbow.imageset/DEV-Rainbow.png create mode 100644 DEV-Simple/views/DEVCanvasView.swift create mode 100644 DEV-Simple/views/OfflineViewController.swift create mode 100644 DEV-Simple/views/UICollectionViewCells/DEVColorCollectionViewCell.swift create mode 100644 DEV-Simple/views/UICollectionViewCells/DEVColorCollectionViewCell.xib diff --git a/Cartfile.resolved b/Cartfile.resolved index ff19afd..f024131 100755 --- a/Cartfile.resolved +++ b/Cartfile.resolved @@ -1,4 +1,4 @@ github "Daltron/NotificationBanner" "2.1.0" github "SnapKit/SnapKit" "4.2.0" github "cbpowell/MarqueeLabel" "3.2.1" -github "pusher/push-notifications-swift" "2.0.0" +github "pusher/push-notifications-swift" "2.0.2" diff --git a/DEV-Simple.xcodeproj/project.pbxproj b/DEV-Simple.xcodeproj/project.pbxproj index 2faabfe..d6f0024 100755 --- a/DEV-Simple.xcodeproj/project.pbxproj +++ b/DEV-Simple.xcodeproj/project.pbxproj @@ -7,6 +7,10 @@ objects = { /* Begin PBXBuildFile section */ + 16800D5B22CD05C300429E36 /* OfflineViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16800D5A22CD05C300429E36 /* OfflineViewController.swift */; }; + 16800D5F22CD067D00429E36 /* DEVColorCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16800D5D22CD067D00429E36 /* DEVColorCollectionViewCell.swift */; }; + 16800D6022CD067D00429E36 /* DEVColorCollectionViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 16800D5E22CD067D00429E36 /* DEVColorCollectionViewCell.xib */; }; + 16800D6222CD0C9500429E36 /* DEVCanvasView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16800D6122CD0C9500429E36 /* DEVCanvasView.swift */; }; 1B032B1821E409FE00A2108A /* Globals.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B032B1721E409FE00A2108A /* Globals.swift */; }; 1BA17C87220C8470007A8EF5 /* invertedImages.css in Resources */ = {isa = PBXBuildFile; fileRef = 1BA17C86220C8470007A8EF5 /* invertedImages.css */; }; 73D7673C218BA66700BD13B6 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73D7673B218BA66700BD13B6 /* AppDelegate.swift */; }; @@ -44,6 +48,10 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ + 16800D5A22CD05C300429E36 /* OfflineViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OfflineViewController.swift; sourceTree = ""; }; + 16800D5D22CD067D00429E36 /* DEVColorCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DEVColorCollectionViewCell.swift; sourceTree = ""; }; + 16800D5E22CD067D00429E36 /* DEVColorCollectionViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = DEVColorCollectionViewCell.xib; sourceTree = ""; }; + 16800D6122CD0C9500429E36 /* DEVCanvasView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DEVCanvasView.swift; sourceTree = ""; }; 1B032B1721E409FE00A2108A /* Globals.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Globals.swift; sourceTree = ""; }; 1BA17C86220C8470007A8EF5 /* invertedImages.css */ = {isa = PBXFileReference; lastKnownFileType = text.css; path = invertedImages.css; sourceTree = ""; }; 73D76738218BA66700BD13B6 /* DEV-Simple.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "DEV-Simple.app"; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -99,11 +107,23 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 16800D5C22CD065300429E36 /* UICollectionViewCells */ = { + isa = PBXGroup; + children = ( + 16800D5D22CD067D00429E36 /* DEVColorCollectionViewCell.swift */, + 16800D5E22CD067D00429E36 /* DEVColorCollectionViewCell.xib */, + ); + path = UICollectionViewCells; + sourceTree = ""; + }; 1BA17C88220C847B007A8EF5 /* views */ = { isa = PBXGroup; children = ( + 16800D5C22CD065300429E36 /* UICollectionViewCells */, 73D7673D218BA66700BD13B6 /* ViewController.swift */, 73E8ACC62192165E009CE057 /* BrowserViewController.swift */, + 16800D5A22CD05C300429E36 /* OfflineViewController.swift */, + 16800D6122CD0C9500429E36 /* DEVCanvasView.swift */, ); path = views; sourceTree = ""; @@ -322,6 +342,7 @@ 73D76746218BA66B00BD13B6 /* LaunchScreen.storyboard in Resources */, 73D76743218BA66B00BD13B6 /* Assets.xcassets in Resources */, 73D76741218BA66700BD13B6 /* Main.storyboard in Resources */, + 16800D6022CD067D00429E36 /* DEVColorCollectionViewCell.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -392,8 +413,11 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 16800D5B22CD05C300429E36 /* OfflineViewController.swift in Sources */, 73D7673E218BA66700BD13B6 /* ViewController.swift in Sources */, + 16800D5F22CD067D00429E36 /* DEVColorCollectionViewCell.swift in Sources */, 73E8ACC72192165E009CE057 /* BrowserViewController.swift in Sources */, + 16800D6222CD0C9500429E36 /* DEVCanvasView.swift in Sources */, 73D7673C218BA66700BD13B6 /* AppDelegate.swift in Sources */, 1B032B1821E409FE00A2108A /* Globals.swift in Sources */, BD5C906C21B63CCC000D9F79 /* NetworkReachability.swift in Sources */, diff --git a/DEV-Simple/assets/Assets.xcassets/DEV-Rainbow.imageset/Contents.json b/DEV-Simple/assets/Assets.xcassets/DEV-Rainbow.imageset/Contents.json new file mode 100644 index 0000000..e908ea6 --- /dev/null +++ b/DEV-Simple/assets/Assets.xcassets/DEV-Rainbow.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "DEV-Rainbow.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/DEV-Simple/assets/Assets.xcassets/DEV-Rainbow.imageset/DEV-Rainbow.png b/DEV-Simple/assets/Assets.xcassets/DEV-Rainbow.imageset/DEV-Rainbow.png new file mode 100644 index 0000000000000000000000000000000000000000..1865245200808eba6f0f3a71ef5d4ab9a8db8a80 GIT binary patch literal 45417 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

^JV#8+XQQUS4fvo;r{hs^6Yh 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 Bool { + launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { self.pushNotifications.start(instanceId: "cdaf9857-fad0-4bfb-b360-64c1b2693ef3") self.pushNotifications.registerForRemoteNotifications() try? self.pushNotifications.addDeviceInterest(interest: "broadcast") diff --git a/DEV-Simple/storyboards/Base.lproj/Main.storyboard b/DEV-Simple/storyboards/Base.lproj/Main.storyboard index 5b86f54..edc1543 100755 --- a/DEV-Simple/storyboards/Base.lproj/Main.storyboard +++ b/DEV-Simple/storyboards/Base.lproj/Main.storyboard @@ -82,6 +82,7 @@ + @@ -151,9 +152,155 @@ + + + + + + + + + + + + + + + + + + + + + + + + +Cgo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Good news: You can draw a picture anywhere on this page while you wait to get it back! + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/DEV-Simple/views/DEVCanvasView.swift b/DEV-Simple/views/DEVCanvasView.swift new file mode 100644 index 0000000..a075b98 --- /dev/null +++ b/DEV-Simple/views/DEVCanvasView.swift @@ -0,0 +1,47 @@ +// +// DEVCanvasView.swift +// DEV-Simple +// +// Created by Jacob Boyd on 7/3/19. +// Copyright © 2019 DEV. All rights reserved. +// + +import UIKit + +class DEVCanvasView: UIView { + var startingPoint: CGPoint! + var touchPoint: CGPoint! + var path: UIBezierPath! + var strokeColor: CGColor! = UIColor(red: 244/255, green: 144/255, blue: 142/255, alpha: 1).cgColor + + func setStrokeColor(_ color: UIColor) { + self.strokeColor = color.cgColor + } + + override func touchesBegan(_ touches: Set, with event: UIEvent?) { + let touch = touches.first + startingPoint = touch?.location(in: self) + } + + override func touchesMoved(_ touches: Set, with event: UIEvent?) { + let touch = touches.first + touchPoint = touch?.location(in: self) + + path = UIBezierPath() + path?.move(to: startingPoint) + path?.addLine(to: touchPoint) + startingPoint = touchPoint + drawShapeLayer() + } + + private func drawShapeLayer() { + let shapeLayer = CAShapeLayer() + shapeLayer.path = path.cgPath + shapeLayer.strokeColor = strokeColor + shapeLayer.lineWidth = 3 + shapeLayer.fillColor = UIColor.clear.cgColor + self.layer.addSublayer(shapeLayer) + self.setNeedsDisplay() + } + +} diff --git a/DEV-Simple/views/OfflineViewController.swift b/DEV-Simple/views/OfflineViewController.swift new file mode 100644 index 0000000..b40a5ba --- /dev/null +++ b/DEV-Simple/views/OfflineViewController.swift @@ -0,0 +1,72 @@ +// +// OfflineViewController.swift +// DEV-Simple +// +// Created by Jacob Boyd on 7/3/19. +// Copyright © 2019 DEV. All rights reserved. +// + +import UIKit + +class OfflineViewController: UIViewController { + static let segueId = "showOffline" + @IBOutlet weak var collectionView: UICollectionView! + @IBOutlet weak var drawingCanvas: DEVCanvasView! + var selectedCell: DEVColorCollectionViewCell? + + let colors = [ + UIColor(red: 244/255, green: 144/255, blue: 142/255, alpha: 1), + UIColor(red: 242/255, green: 240/255, blue: 151/255, alpha: 1), + UIColor(red: 136/255, green: 176/255, blue: 220/255, alpha: 1), + UIColor(red: 247/255, green: 181/255, blue: 209/255, alpha: 1), + UIColor(red: 83/255, green: 196/255, blue: 175/255, alpha: 1), + UIColor(red: 253/255, green: 227/255, blue: 140/255, alpha: 1) + ] + + override func viewDidLoad() { + super.viewDidLoad() + + self.collectionView.delegate = self + self.collectionView.dataSource = self + self.collectionView.register( + UINib(nibName: "DEVColorCollectionViewCell", bundle: Bundle.main), + forCellWithReuseIdentifier: DEVColorCollectionViewCell.cellId) + } + + @IBAction func dismissBtnTapped(_ sender: Any) { + if let presentingVC = self.presentingViewController { + presentingVC.dismiss(animated: true, completion: nil) + } + } + +} + +extension OfflineViewController: UICollectionViewDataSource, UICollectionViewDelegate { + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return colors.count + } + + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) + -> UICollectionViewCell { + guard let cell = collectionView.dequeueReusableCell( + withReuseIdentifier: DEVColorCollectionViewCell.cellId, + for: indexPath) as? DEVColorCollectionViewCell else { + return UICollectionViewCell() + } + cell.configureCell(bgColor: colors[indexPath.item]) + if indexPath.item == 0 { + cell.setSelected(true) + } + return cell + } + + func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + if let cell = collectionView.cellForItem(at: indexPath) as? DEVColorCollectionViewCell, selectedCell != cell { + selectedCell?.setSelected(false) + cell.setSelected(true) + self.selectedCell = cell + + self.drawingCanvas.setStrokeColor(colors[indexPath.item]) + } + } +} diff --git a/DEV-Simple/views/UICollectionViewCells/DEVColorCollectionViewCell.swift b/DEV-Simple/views/UICollectionViewCells/DEVColorCollectionViewCell.swift new file mode 100644 index 0000000..f9cc90c --- /dev/null +++ b/DEV-Simple/views/UICollectionViewCells/DEVColorCollectionViewCell.swift @@ -0,0 +1,34 @@ +// +// DEVColorCollectionViewCell.swift +// DEV-Simple +// +// Created by Jacob Boyd on 7/3/19. +// Copyright © 2019 DEV. All rights reserved. +// + +import UIKit + +class DEVColorCollectionViewCell: UICollectionViewCell { + static let cellId = "DEVColorCell" + + override func awakeFromNib() { + super.awakeFromNib() + // Initialization code + self.layer.borderColor = UIColor.darkGray.cgColor + } + + func configureCell(bgColor: UIColor) { + self.clipsToBounds = true + self.layer.cornerRadius = self.bounds.width / 2 + self.backgroundColor = bgColor + } + + func setSelected(_ selected: Bool) { + if selected { + self.layer.borderWidth = 2 + } else { + self.layer.borderWidth = 0 + } + } + +} diff --git a/DEV-Simple/views/UICollectionViewCells/DEVColorCollectionViewCell.xib b/DEV-Simple/views/UICollectionViewCells/DEVColorCollectionViewCell.xib new file mode 100644 index 0000000..7a52d6a --- /dev/null +++ b/DEV-Simple/views/UICollectionViewCells/DEVColorCollectionViewCell.xib @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/DEV-Simple/views/ViewController.swift b/DEV-Simple/views/ViewController.swift index e38c4c5..412ce90 100755 --- a/DEV-Simple/views/ViewController.swift +++ b/DEV-Simple/views/ViewController.swift @@ -124,12 +124,12 @@ class ViewController: UIViewController { switch reachability.status { case .wifi: - if errorBanner.isDisplaying { - errorBanner.dismiss() + if self.presentedViewController != nil { + self.dismiss(animated: true, completion: nil) } case .wwan: - if errorBanner.isDisplaying { - errorBanner.dismiss() + if self.presentedViewController != nil { + self.dismiss(animated: true, completion: nil) } default: break @@ -154,7 +154,7 @@ class ViewController: UIViewController { } // MARK: - Observers - override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey:Any]?, + override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey: Any]?, context: UnsafeMutableRawPointer?) { backButton.isEnabled = webView.canGoBack forwardButton.isEnabled = webView.canGoForward @@ -317,10 +317,10 @@ extension ViewController: WKNavigationDelegate { func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) { let reachability = Network.reachability guard let isNetworkReachable = reachability?.isReachable, isNetworkReachable else { - errorBanner.show() + self.performSegue(withIdentifier: OfflineViewController.segueId, sender: self) return } - + activityIndicator.startAnimating() } From 5f1bf33d008b0444093c20cfb2c00d1d0a9f7c89 Mon Sep 17 00:00:00 2001 From: Jacob Boyd Date: Wed, 3 Jul 2019 13:52:56 -0400 Subject: [PATCH 2/5] Updated to remove trailing whitespaces --- DEV-Simple/views/DEVCanvasView.swift | 6 +++--- DEV-Simple/views/OfflineViewController.swift | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/DEV-Simple/views/DEVCanvasView.swift b/DEV-Simple/views/DEVCanvasView.swift index a075b98..52ccb04 100644 --- a/DEV-Simple/views/DEVCanvasView.swift +++ b/DEV-Simple/views/DEVCanvasView.swift @@ -17,7 +17,7 @@ class DEVCanvasView: UIView { func setStrokeColor(_ color: UIColor) { self.strokeColor = color.cgColor } - + override func touchesBegan(_ touches: Set, with event: UIEvent?) { let touch = touches.first startingPoint = touch?.location(in: self) @@ -26,7 +26,7 @@ class DEVCanvasView: UIView { override func touchesMoved(_ touches: Set, with event: UIEvent?) { let touch = touches.first touchPoint = touch?.location(in: self) - + path = UIBezierPath() path?.move(to: startingPoint) path?.addLine(to: touchPoint) @@ -43,5 +43,5 @@ class DEVCanvasView: UIView { self.layer.addSublayer(shapeLayer) self.setNeedsDisplay() } - + } diff --git a/DEV-Simple/views/OfflineViewController.swift b/DEV-Simple/views/OfflineViewController.swift index b40a5ba..45a87af 100644 --- a/DEV-Simple/views/OfflineViewController.swift +++ b/DEV-Simple/views/OfflineViewController.swift @@ -13,7 +13,7 @@ class OfflineViewController: UIViewController { @IBOutlet weak var collectionView: UICollectionView! @IBOutlet weak var drawingCanvas: DEVCanvasView! var selectedCell: DEVColorCollectionViewCell? - + let colors = [ UIColor(red: 244/255, green: 144/255, blue: 142/255, alpha: 1), UIColor(red: 242/255, green: 240/255, blue: 151/255, alpha: 1), From fbdb03932d3dfa84871bbd7e23cc75a9c13b282f Mon Sep 17 00:00:00 2001 From: Jacob Boyd Date: Wed, 3 Jul 2019 14:37:34 -0400 Subject: [PATCH 3/5] last whitespace warning from lint --- DEV-Simple/views/DEVCanvasView.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DEV-Simple/views/DEVCanvasView.swift b/DEV-Simple/views/DEVCanvasView.swift index 52ccb04..0f951f8 100644 --- a/DEV-Simple/views/DEVCanvasView.swift +++ b/DEV-Simple/views/DEVCanvasView.swift @@ -13,7 +13,7 @@ class DEVCanvasView: UIView { var touchPoint: CGPoint! var path: UIBezierPath! var strokeColor: CGColor! = UIColor(red: 244/255, green: 144/255, blue: 142/255, alpha: 1).cgColor - + func setStrokeColor(_ color: UIColor) { self.strokeColor = color.cgColor } From 690f5df195f8bdd5592d7fb0f481afcc26ad40c0 Mon Sep 17 00:00:00 2001 From: Jacob Boyd Date: Wed, 3 Jul 2019 14:46:17 -0400 Subject: [PATCH 4/5] Removed Error banner - replaced with OfflineVC --- DEV-Simple/views/ViewController.swift | 7 ------- 1 file changed, 7 deletions(-) diff --git a/DEV-Simple/views/ViewController.swift b/DEV-Simple/views/ViewController.swift index 412ce90..2536c4a 100755 --- a/DEV-Simple/views/ViewController.swift +++ b/DEV-Simple/views/ViewController.swift @@ -74,13 +74,6 @@ class ViewController: UIViewController { let darkBackgroundColor = UIColor(red: 13/255, green: 18/255, blue: 25/255, alpha: 1) let pushNotifications = PushNotifications.shared - lazy var errorBanner: NotificationBanner = { - let banner = NotificationBanner(title: "Network not reachable", style: .danger) - banner.autoDismiss = false - banner.dismissOnTap = true - return banner - }() - var devToURL = "https://dev.to" override func viewDidLoad() { From 05b3d138524e18b99e920164589ceb7227721da1 Mon Sep 17 00:00:00 2001 From: Jacob Boyd Date: Wed, 3 Jul 2019 15:35:46 -0400 Subject: [PATCH 5/5] moved segueId to globals, finished replacing notificaton banner, subscribed to reachability --- DEV-Simple/core/Globals.swift | 1 + DEV-Simple/views/OfflineViewController.swift | 32 +++++++++++++++++++- DEV-Simple/views/ViewController.swift | 2 +- 3 files changed, 33 insertions(+), 2 deletions(-) diff --git a/DEV-Simple/core/Globals.swift b/DEV-Simple/core/Globals.swift index 340555d..78297cf 100755 --- a/DEV-Simple/core/Globals.swift +++ b/DEV-Simple/core/Globals.swift @@ -10,4 +10,5 @@ import Foundation struct DoAction { static var openExternalURL = "showExternalPage" + static let offlineViewController = "showOffline" } diff --git a/DEV-Simple/views/OfflineViewController.swift b/DEV-Simple/views/OfflineViewController.swift index 45a87af..82aa7de 100644 --- a/DEV-Simple/views/OfflineViewController.swift +++ b/DEV-Simple/views/OfflineViewController.swift @@ -9,12 +9,12 @@ import UIKit class OfflineViewController: UIViewController { - static let segueId = "showOffline" @IBOutlet weak var collectionView: UICollectionView! @IBOutlet weak var drawingCanvas: DEVCanvasView! var selectedCell: DEVColorCollectionViewCell? let colors = [ + // This are RGB values, just be sure to divide by 255 UIColor(red: 244/255, green: 144/255, blue: 142/255, alpha: 1), UIColor(red: 242/255, green: 240/255, blue: 151/255, alpha: 1), UIColor(red: 136/255, green: 176/255, blue: 220/255, alpha: 1), @@ -26,11 +26,37 @@ class OfflineViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() + // register the VC as the delegate, datasource and then connect + // the collectionViewCell with xib file self.collectionView.delegate = self self.collectionView.dataSource = self self.collectionView.register( UINib(nibName: "DEVColorCollectionViewCell", bundle: Bundle.main), forCellWithReuseIdentifier: DEVColorCollectionViewCell.cellId) + + //Subscribe to reachability changes notifications + NotificationCenter.default.addObserver( + self, + selector: #selector(reachabilityChanged), + name: .flagsChanged, + object: Network.reachability) + } + + // MARK: - Reachability + @objc private func reachabilityChanged(note: Notification) { + guard let reachability = note.object as? Reachability else { + return + } + + // If the user gains connection, dismiss the VC + switch reachability.status { + case .wifi: + self.dismissBtnTapped(self) + case .wwan: + self.dismissBtnTapped(self) + default: + break + } } @IBAction func dismissBtnTapped(_ sender: Any) { @@ -54,12 +80,16 @@ extension OfflineViewController: UICollectionViewDataSource, UICollectionViewDel return UICollectionViewCell() } cell.configureCell(bgColor: colors[indexPath.item]) + // Set the selectedCell as the first color by default if indexPath.item == 0 { + self.selectedCell = cell cell.setSelected(true) } return cell } + // When a cell is selected, update the UI to reflect the selection + // and change the strokeColor for drawing func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { if let cell = collectionView.cellForItem(at: indexPath) as? DEVColorCollectionViewCell, selectedCell != cell { selectedCell?.setSelected(false) diff --git a/DEV-Simple/views/ViewController.swift b/DEV-Simple/views/ViewController.swift index 2536c4a..c87c631 100755 --- a/DEV-Simple/views/ViewController.swift +++ b/DEV-Simple/views/ViewController.swift @@ -310,7 +310,7 @@ extension ViewController: WKNavigationDelegate { func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) { let reachability = Network.reachability guard let isNetworkReachable = reachability?.isReachable, isNetworkReachable else { - self.performSegue(withIdentifier: OfflineViewController.segueId, sender: self) + self.performSegue(withIdentifier: DoAction.offlineViewController, sender: self) return }