Archived
1
Fork 0

Improve swift safety

This commit is contained in:
redstrate 2020-03-16 12:10:53 -04:00
parent 52e6ffc8d0
commit 1b7c66e206
5 changed files with 68 additions and 62 deletions

View file

@ -69,6 +69,8 @@ class PostCollectionView: UICollectionView, UICollectionViewDataSource, UICollec
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "postCell", for: indexPath as IndexPath) as! PostViewCell 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 let imagePath = documentsPath.appendingPathComponent(post.value(forKey: "name") as! String).path
if(FileManager.default.fileExists(atPath: imagePath)) { if(FileManager.default.fileExists(atPath: imagePath)) {
@ -279,8 +281,10 @@ class PostCollectionView: UICollectionView, UICollectionViewDataSource, UICollec
let model = posts[indexPath.item] let model = posts[indexPath.item]
let itemProvider = NSItemProvider(object: (cellForItem(at: indexPath) as! PostViewCell).imageView.image!) let itemProvider = NSItemProvider(object: (cellForItem(at: indexPath) as! PostViewCell).imageView.image!)
itemProvider.suggestedName = model.value(forKey: "name") as? String itemProvider.suggestedName = model.value(forKey: "name") as? String
let dragItem = UIDragItem(itemProvider: itemProvider)
dragItem.localObject = model //We can set the localObject property for convenience let dragItem = UIDragItem(itemProvider: itemProvider)
return [dragItem] dragItem.localObject = model //We can set the localObject property for convenience
return [dragItem]
} }
} }

View file

@ -1,7 +1,8 @@
import UIKit import UIKit
class PostViewCell: UICollectionViewCell { class PostViewCell: UICollectionViewCell {
var name: String?
@IBOutlet weak var imageView: UIImageView! @IBOutlet weak var imageView: UIImageView!
} }

View file

@ -4,32 +4,34 @@ import AVFoundation
import AVKit import AVKit
class PostViewController: UIViewController { class PostViewController: UIViewController {
@IBOutlet weak var imageView: UIImageView! @IBOutlet weak var imageView: UIImageView?
@IBOutlet weak var shareButton: UIBarButtonItem?
var post: NSManagedObject? var post: NSManagedObject?
var image: UIImage? var image: UIImage?
var isPopup: Bool = false var isPopup: Bool = false
@IBOutlet weak var shareButton: UIBarButtonItem!
let documentsPath : URL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0].absoluteURL let documentsPath : URL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0].absoluteURL
override func viewWillAppear(_ animated: Bool) { override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated) super.viewWillAppear(animated)
if(image == nil) { if post != nil {
let imagePath = documentsPath.appendingPathComponent(post!.value(forKey: "name") as! String).path 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)) if((post?.value(forKey: "type") as? String) == "public.mpeg-4") {
} else { self.image = generateThumbnail(path: URL(fileURLWithPath: imagePath))
self.image = UIImage(contentsOfFile: imagePath) } else {
self.image = UIImage(contentsOfFile: imagePath)
}
} }
}
imageView.image = self.image imageView?.image = self.image
if(isPopup) { if(isPopup) {
navigationItem.leftBarButtonItem = UIBarButtonItem(title: "Done", style: .plain, target: self, action: #selector(closePopup)) 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?) { override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "showTags" { 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 newViewController.post = self.post as? Post
} else if segue.identifier == "showInfo" { } 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.post = self.post as? Post
newViewController.image = self.image newViewController.image = self.image
@ -87,6 +93,7 @@ extension PostViewController {
#if targetEnvironment(macCatalyst) #if targetEnvironment(macCatalyst)
private let EditButtonToolbarIdentifier = NSToolbarItem.Identifier(rawValue: "OurButton") private let EditButtonToolbarIdentifier = NSToolbarItem.Identifier(rawValue: "OurButton")
private let ShareButtonToolbarIdentifier = NSToolbarItem.Identifier(rawValue: "OurButton2") private let ShareButtonToolbarIdentifier = NSToolbarItem.Identifier(rawValue: "OurButton2")
private let InfoButtonToolbarIdentifier = NSToolbarItem.Identifier(rawValue: "OurButton3") private let InfoButtonToolbarIdentifier = NSToolbarItem.Identifier(rawValue: "OurButton3")
@ -144,4 +151,5 @@ extension PostViewController: NSToolbarDelegate {
return nil return nil
} }
} }
#endif #endif

View file

@ -12,34 +12,21 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate {
} }
#if targetEnvironment(macCatalyst) #if targetEnvironment(macCatalyst)
guard let windowScene = (scene as? UIWindowScene) else { return } guard let windowScene = (scene as? UIWindowScene) else {
let toolbar = NSToolbar(identifier: "MyToolbar") return
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
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 #endif
} }
func sceneDidDisconnect(_ scene: UIScene) {
}
func sceneDidBecomeActive(_ scene: UIScene) {
}
func sceneWillResignActive(_ scene: UIScene) {
}
func sceneWillEnterForeground(_ scene: UIScene) {
}
func sceneDidEnterBackground(_ scene: UIScene) { func sceneDidEnterBackground(_ scene: UIScene) {
(UIApplication.shared.delegate as? AppDelegate)?.saveContext() (UIApplication.shared.delegate as? AppDelegate)?.saveContext()
} }
@ -48,14 +35,12 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate {
if activity.activityType == "post" { if activity.activityType == "post" {
if let photoID = activity.userInfo?["name"] as? String { if let photoID = activity.userInfo?["name"] as? String {
if let photoDetailViewController = PostViewController.loadFromStoryboard() { if let photoDetailViewController = PostViewController.loadFromStoryboard() {
guard let appDelegate = guard let appDelegate =
UIApplication.shared.delegate as? AppDelegate else { UIApplication.shared.delegate as? AppDelegate else {
return false return false
} }
let managedContext = let managedContext = appDelegate.persistentContainer.viewContext
appDelegate.persistentContainer.viewContext
let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Post") let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Post")
@ -65,7 +50,11 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate {
do { do {
let result = try managedContext.fetch(request) 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 photoDetailViewController.isPopup = true
if let navigationController = window?.rootViewController as? UINavigationController { if let navigationController = window?.rootViewController as? UINavigationController {

View file

@ -83,19 +83,23 @@ class ViewController: UIViewController, UIDocumentPickerDelegate {
override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool { override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool {
if identifier == "showPost" { if identifier == "showPost" {
#if targetEnvironment(macCatalyst) #if targetEnvironment(macCatalyst)
let index = self.collectionView.indexPathsForSelectedItems?.first guard let cell = sender as? PostViewCell else {
return false
let post = self.collectionView.posts[index!.row] }
let activity = NSUserActivity(activityType: "post") guard let name = cell.name else {
activity.userInfo = ["name": post.value(forKey: "name") as! String] return false
activity.isEligibleForHandoff = true }
UIApplication.shared.requestSceneSessionActivation(nil, userActivity: activity, options: nil, errorHandler: nil) let activity = NSUserActivity(activityType: "post")
activity.userInfo = ["name": name]
return false activity.isEligibleForHandoff = true
UIApplication.shared.requestSceneSessionActivation(nil, userActivity: activity, options: nil, errorHandler: nil)
return false
#else #else
return true return true
#endif #endif
} }
@ -124,7 +128,7 @@ extension ViewController: NSToolbarDelegate {
func toolbarAllowedItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier] { func toolbarAllowedItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier] {
return toolbarDefaultItemIdentifiers(toolbar) return toolbarDefaultItemIdentifiers(toolbar)
} }
func toolbar(_ toolbar: NSToolbar, itemForItemIdentifier itemIdentifier: NSToolbarItem.Identifier, willBeInsertedIntoToolbar flag: Bool) -> NSToolbarItem? { func toolbar(_ toolbar: NSToolbar, itemForItemIdentifier itemIdentifier: NSToolbarItem.Identifier, willBeInsertedIntoToolbar flag: Bool) -> NSToolbarItem? {
if (itemIdentifier == OurButtonToolbarIdentifier2) { if (itemIdentifier == OurButtonToolbarIdentifier2) {
let barButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonItem.SystemItem.add, let barButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonItem.SystemItem.add,