From 1b7c66e206f6a3b7b7a5a5f238e6f42cfc43541f Mon Sep 17 00:00:00 2001 From: redstrate <54911369+redstrate@users.noreply.github.com> Date: Mon, 16 Mar 2020 12:10:53 -0400 Subject: [PATCH] Improve swift safety --- Gallery/PostCollectionView.swift | 10 ++++--- Gallery/PostViewCell.swift | 3 ++- Gallery/PostViewController.swift | 42 +++++++++++++++++------------ Gallery/SceneDelegate.swift | 45 ++++++++++++-------------------- Gallery/ViewController.swift | 30 ++++++++++++--------- 5 files changed, 68 insertions(+), 62 deletions(-) diff --git a/Gallery/PostCollectionView.swift b/Gallery/PostCollectionView.swift index b2ccb59..91914db 100644 --- a/Gallery/PostCollectionView.swift +++ b/Gallery/PostCollectionView.swift @@ -69,6 +69,8 @@ class PostCollectionView: UICollectionView, UICollectionViewDataSource, UICollec let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "postCell", for: indexPath as IndexPath) as! PostViewCell + cell.name = post.value(forKey: "name") as? String + let imagePath = documentsPath.appendingPathComponent(post.value(forKey: "name") as! String).path if(FileManager.default.fileExists(atPath: imagePath)) { @@ -279,8 +281,10 @@ class PostCollectionView: UICollectionView, UICollectionViewDataSource, UICollec let model = posts[indexPath.item] let itemProvider = NSItemProvider(object: (cellForItem(at: indexPath) as! PostViewCell).imageView.image!) itemProvider.suggestedName = model.value(forKey: "name") as? String - let dragItem = UIDragItem(itemProvider: itemProvider) - dragItem.localObject = model //We can set the localObject property for convenience - return [dragItem] + + let dragItem = UIDragItem(itemProvider: itemProvider) + dragItem.localObject = model //We can set the localObject property for convenience + + return [dragItem] } } diff --git a/Gallery/PostViewCell.swift b/Gallery/PostViewCell.swift index 73a5ca6..ed880a9 100644 --- a/Gallery/PostViewCell.swift +++ b/Gallery/PostViewCell.swift @@ -1,7 +1,8 @@ import UIKit class PostViewCell: UICollectionViewCell { - + var name: String? + @IBOutlet weak var imageView: UIImageView! } diff --git a/Gallery/PostViewController.swift b/Gallery/PostViewController.swift index e72e113..5106532 100644 --- a/Gallery/PostViewController.swift +++ b/Gallery/PostViewController.swift @@ -4,32 +4,34 @@ import AVFoundation import AVKit class PostViewController: UIViewController { - @IBOutlet weak var imageView: UIImageView! - + @IBOutlet weak var imageView: UIImageView? + @IBOutlet weak var shareButton: UIBarButtonItem? + var post: NSManagedObject? var image: UIImage? var isPopup: Bool = false - @IBOutlet weak var shareButton: UIBarButtonItem! let documentsPath : URL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0].absoluteURL override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) - if(image == nil) { - let imagePath = documentsPath.appendingPathComponent(post!.value(forKey: "name") as! String).path - - if((post?.value(forKey: "type") as? String) == "public.mpeg-4") { - self.image = generateThumbnail(path: URL(fileURLWithPath: imagePath)) - } else { - self.image = UIImage(contentsOfFile: imagePath) + if post != nil { + if image == nil { + let imagePath = documentsPath.appendingPathComponent(post!.value(forKey: "name") as! String).path + + if((post?.value(forKey: "type") as? String) == "public.mpeg-4") { + self.image = generateThumbnail(path: URL(fileURLWithPath: imagePath)) + } else { + self.image = UIImage(contentsOfFile: imagePath) + } } - } - imageView.image = self.image - - if(isPopup) { - navigationItem.leftBarButtonItem = UIBarButtonItem(title: "Done", style: .plain, target: self, action: #selector(closePopup)) + imageView?.image = self.image + + if(isPopup) { + navigationItem.leftBarButtonItem = UIBarButtonItem(title: "Done", style: .plain, target: self, action: #selector(closePopup)) + } } } @@ -50,11 +52,15 @@ class PostViewController: UIViewController { override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "showTags" { - let newViewController = segue.destination as! EditTagsViewController + guard let newViewController = segue.destination as? EditTagsViewController else { + return + } newViewController.post = self.post as? Post } else if segue.identifier == "showInfo" { - let newViewController = segue.destination as! InfoViewController + guard let newViewController = segue.destination as? InfoViewController else { + return + } newViewController.post = self.post as? Post newViewController.image = self.image @@ -87,6 +93,7 @@ extension PostViewController { #if targetEnvironment(macCatalyst) + private let EditButtonToolbarIdentifier = NSToolbarItem.Identifier(rawValue: "OurButton") private let ShareButtonToolbarIdentifier = NSToolbarItem.Identifier(rawValue: "OurButton2") private let InfoButtonToolbarIdentifier = NSToolbarItem.Identifier(rawValue: "OurButton3") @@ -144,4 +151,5 @@ extension PostViewController: NSToolbarDelegate { return nil } } + #endif diff --git a/Gallery/SceneDelegate.swift b/Gallery/SceneDelegate.swift index 72ad55b..27fd620 100644 --- a/Gallery/SceneDelegate.swift +++ b/Gallery/SceneDelegate.swift @@ -12,34 +12,21 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { } #if targetEnvironment(macCatalyst) - guard let windowScene = (scene as? UIWindowScene) else { return } - let toolbar = NSToolbar(identifier: "MyToolbar") - toolbar.delegate = (window?.rootViewController as! UINavigationController).topViewController as? NSToolbarDelegate - windowScene.titlebar!.toolbar = toolbar - windowScene.titlebar!.titleVisibility = .hidden - toolbar.allowsUserCustomization = true - - (window?.rootViewController as! UINavigationController).navigationBar.isHidden = true + guard let windowScene = (scene as? UIWindowScene) else { + return + } + let toolbar = NSToolbar(identifier: "Toolbar") + toolbar.delegate = (window?.rootViewController as! UINavigationController).topViewController as? NSToolbarDelegate + toolbar.allowsUserCustomization = true + + windowScene.titlebar!.toolbar = toolbar + windowScene.titlebar!.titleVisibility = .hidden + + (window?.rootViewController as! UINavigationController).navigationBar.isHidden = true #endif } - func sceneDidDisconnect(_ scene: UIScene) { - - } - - func sceneDidBecomeActive(_ scene: UIScene) { - - } - - func sceneWillResignActive(_ scene: UIScene) { - - } - - func sceneWillEnterForeground(_ scene: UIScene) { - - } - func sceneDidEnterBackground(_ scene: UIScene) { (UIApplication.shared.delegate as? AppDelegate)?.saveContext() } @@ -48,14 +35,12 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { if activity.activityType == "post" { if let photoID = activity.userInfo?["name"] as? String { if let photoDetailViewController = PostViewController.loadFromStoryboard() { - guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return false } - let managedContext = - appDelegate.persistentContainer.viewContext + let managedContext = appDelegate.persistentContainer.viewContext let request = NSFetchRequest(entityName: "Post") @@ -65,7 +50,11 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { do { let result = try managedContext.fetch(request) - photoDetailViewController.post = result[0] as? NSManagedObject + guard let object = result[0] as? NSManagedObject else { + return false + } + + photoDetailViewController.post = object photoDetailViewController.isPopup = true if let navigationController = window?.rootViewController as? UINavigationController { diff --git a/Gallery/ViewController.swift b/Gallery/ViewController.swift index 31d9a58..717fedf 100644 --- a/Gallery/ViewController.swift +++ b/Gallery/ViewController.swift @@ -83,19 +83,23 @@ class ViewController: UIViewController, UIDocumentPickerDelegate { override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool { if identifier == "showPost" { #if targetEnvironment(macCatalyst) - let index = self.collectionView.indexPathsForSelectedItems?.first - - let post = self.collectionView.posts[index!.row] - - let activity = NSUserActivity(activityType: "post") - activity.userInfo = ["name": post.value(forKey: "name") as! String] - activity.isEligibleForHandoff = true - - UIApplication.shared.requestSceneSessionActivation(nil, userActivity: activity, options: nil, errorHandler: nil) - - return false + guard let cell = sender as? PostViewCell else { + return false + } + + guard let name = cell.name else { + return false + } + + let activity = NSUserActivity(activityType: "post") + activity.userInfo = ["name": name] + activity.isEligibleForHandoff = true + + UIApplication.shared.requestSceneSessionActivation(nil, userActivity: activity, options: nil, errorHandler: nil) + + return false #else - return true + return true #endif } @@ -124,7 +128,7 @@ extension ViewController: NSToolbarDelegate { func toolbarAllowedItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier] { return toolbarDefaultItemIdentifiers(toolbar) } - + func toolbar(_ toolbar: NSToolbar, itemForItemIdentifier itemIdentifier: NSToolbarItem.Identifier, willBeInsertedIntoToolbar flag: Bool) -> NSToolbarItem? { if (itemIdentifier == OurButtonToolbarIdentifier2) { let barButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonItem.SystemItem.add,