diff --git a/Gallery/Base.lproj/Main.storyboard b/Gallery/Base.lproj/Main.storyboard index c1bbd27..3e9e81a 100644 --- a/Gallery/Base.lproj/Main.storyboard +++ b/Gallery/Base.lproj/Main.storyboard @@ -1,8 +1,8 @@ - + - + @@ -168,14 +168,14 @@ - + - + diff --git a/Gallery/PostCollectionView.swift b/Gallery/PostCollectionView.swift index 26fbb4e..b7b8964 100644 --- a/Gallery/PostCollectionView.swift +++ b/Gallery/PostCollectionView.swift @@ -167,7 +167,6 @@ class PostCollectionView: UICollectionView, UICollectionViewDataSource, UICollec func makeContextMenu(post: NSManagedObject) -> UIMenu { let newWindow = UIAction(title: "Open in New Window", image: UIImage(systemName: "plus.square.on.square")) { action in - let activity = NSUserActivity(activityType: "post") activity.userInfo = ["name": post.value(forKey: "name") as! String] activity.isEligibleForHandoff = true @@ -191,10 +190,18 @@ class PostCollectionView: UICollectionView, UICollectionViewDataSource, UICollec } let editTags = UIAction(title: "Tags", image: UIImage(systemName: "tag")) { action in - let viewController = EditTagsViewController.loadFromStoryboard() - viewController!.post = post as? Post - - self.viewController?.present(viewController!, animated: true) + #if targetEnvironment(macCatalyst) + let activity = NSUserActivity(activityType: "tags") + activity.userInfo = ["name": post.value(forKey: "name") as! String] + activity.isEligibleForHandoff = true + + UIApplication.shared.requestSceneSessionActivation(nil, userActivity: activity, options: nil, errorHandler: nil) + #else + let viewController = EditTagsViewController.loadFromStoryboard() + viewController!.post = post as? Post + + self.viewController?.present(viewController!, animated: true) + #endif } let info = UIAction(title: "Info", image: UIImage(systemName: "info.circle")) { action in diff --git a/Gallery/SceneDelegate.swift b/Gallery/SceneDelegate.swift index 9652659..c3c5cf9 100644 --- a/Gallery/SceneDelegate.swift +++ b/Gallery/SceneDelegate.swift @@ -31,39 +31,55 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { (UIApplication.shared.delegate as? AppDelegate)?.saveContext() } + func getPostFromActivity(activity: NSUserActivity ) -> Post? { + if let photoID = activity.userInfo?["name"] as? String { + guard let appDelegate = + UIApplication.shared.delegate as? AppDelegate else { + return nil + } + + let managedContext = appDelegate.persistentContainer.viewContext + + let request = NSFetchRequest(entityName: "Post") + + request.predicate = NSPredicate(format: "name = %@", photoID) + request.returnsObjectsAsFaults = false + + do { + let result = try managedContext.fetch(request) + + return result[0] as? Post; + } catch _ as NSError { + return nil + } + } + + return nil + } + func configure(window: UIWindow?, with activity: NSUserActivity) -> Bool { if activity.activityType == "post" { - if let photoID = activity.userInfo?["name"] as? String { + if let post = getPostFromActivity(activity: activity) { if let photoDetailViewController = PostViewController.loadFromStoryboard() { - guard let appDelegate = - UIApplication.shared.delegate as? AppDelegate else { - return false + photoDetailViewController.post = post + photoDetailViewController.isPopup = true + + if let navigationController = window?.rootViewController as? UINavigationController { + navigationController.pushViewController(photoDetailViewController, animated: false) + + return true } + } + } + } else if activity.activityType == "tags" { + if let post = getPostFromActivity(activity: activity) { + if let editTagsController = EditTagsViewController.loadFromStoryboard() { + editTagsController.post = post - let managedContext = appDelegate.persistentContainer.viewContext - - let request = NSFetchRequest(entityName: "Post") - - request.predicate = NSPredicate(format: "name = %@", photoID) - request.returnsObjectsAsFaults = false - - do { - let result = try managedContext.fetch(request) + if let navigationController = window?.rootViewController as? UINavigationController { + navigationController.pushViewController(editTagsController, animated: false) - guard let object = result[0] as? NSManagedObject else { - return false - } - - photoDetailViewController.post = object - photoDetailViewController.isPopup = true - - if let navigationController = window?.rootViewController as? UINavigationController { - navigationController.pushViewController(photoDetailViewController, animated: false) - - return true - } - } catch _ as NSError { - return false + return true } } }