From 9abba06fca2ff2e5b0a0e5011c6d4324bb4da36f Mon Sep 17 00:00:00 2001 From: Timo Steinwender Date: Mon, 27 Feb 2017 17:17:41 +0100 Subject: [PATCH 01/13] fixed the following things: 1. added property to disable the file sharing button 2. canRemoveFiles will remove the removeButton in the preview section 3. disabled userInteraction for the check button to handle the selection only over the cell 4. if allowMultipleSelection is disabled: only select one item to avoid misunderstanding --- .../FileExplorer/ActionsViewController.swift | 21 ++++++++++++------- .../FileExplorer/CheckmarkButton.swift | 1 + FileExplorer/FileExplorer/Configuration.swift | 1 + .../DirectoryContentViewController.swift | 18 ++++++++++++++++ .../DirectoryContentViewModel.swift | 14 ++++++++++--- .../FileExplorerViewController.swift | 6 +++++- .../FileItemPresentationCoordinator.swift | 6 ++++-- .../ItemPresentationCoordinator.swift | 4 ++-- 8 files changed, 56 insertions(+), 15 deletions(-) diff --git a/FileExplorer/FileExplorer/ActionsViewController.swift b/FileExplorer/FileExplorer/ActionsViewController.swift index aa5e46e..2a06185 100644 --- a/FileExplorer/FileExplorer/ActionsViewController.swift +++ b/FileExplorer/FileExplorer/ActionsViewController.swift @@ -35,8 +35,9 @@ final class ActionsViewController: UIViewController { private let toolbar = UIToolbar() private let contentViewController: UIViewController - - init(contentViewController: UIViewController) { + fileprivate let configuration: Configuration + init(configuration: Configuration, contentViewController: UIViewController) { + self.configuration = configuration self.contentViewController = contentViewController super.init(nibName: nil, bundle: nil) } @@ -57,11 +58,17 @@ final class ActionsViewController: UIViewController { toolbar.translatesAutoresizingMaskIntoConstraints = false toolbar.sizeToFit() toolbar.pinToBottom(of: view) - toolbar.items = [ - UIBarButtonItem(barButtonSystemItem: .action, target: self, action: #selector(handleShareButtonTap)), - UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: self, action: nil), - UIBarButtonItem(barButtonSystemItem: .trash, target: self, action: #selector(handleTrashButtonTap)) - ] + //always add the flexibleSpace + toolbar.items = [UIBarButtonItem]() + toolbar.items?.append(UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: self, action: nil)) + if configuration.actionsConfiguration.canShareFiles + { + toolbar.items?.insert(UIBarButtonItem(barButtonSystemItem: .action, target: self, action: #selector(handleShareButtonTap)), at: 0) + } + if configuration.actionsConfiguration.canRemoveFiles + { + toolbar.items?.append(UIBarButtonItem(barButtonSystemItem: .trash, target: self, action: #selector(handleTrashButtonTap))) + } addContentChildViewController(contentViewController, insets: UIEdgeInsets(top: 0, left: 0, bottom: toolbar.bounds.height, right: 0)) navigationItem.title = contentViewController.navigationItem.title diff --git a/FileExplorer/FileExplorer/CheckmarkButton.swift b/FileExplorer/FileExplorer/CheckmarkButton.swift index 64cd7b7..2522149 100644 --- a/FileExplorer/FileExplorer/CheckmarkButton.swift +++ b/FileExplorer/FileExplorer/CheckmarkButton.swift @@ -51,6 +51,7 @@ final class CheckmarkButton: UIButton { borderColor = ColorPallete.gray isSelected = false addTarget(self, action: #selector(handleTouchUpInside), for: .touchUpInside) + isUserInteractionEnabled = false } required init?(coder aDecoder: NSCoder) { diff --git a/FileExplorer/FileExplorer/Configuration.swift b/FileExplorer/FileExplorer/Configuration.swift index 4d94b07..5054fe6 100644 --- a/FileExplorer/FileExplorer/Configuration.swift +++ b/FileExplorer/FileExplorer/Configuration.swift @@ -31,6 +31,7 @@ struct Configuration { } struct ActionsConfiguration { + var canShareFiles: Bool = false var canRemoveFiles: Bool = false var canRemoveDirectories: Bool = false var canChooseFiles: Bool = false diff --git a/FileExplorer/FileExplorer/DirectoryContentViewController.swift b/FileExplorer/FileExplorer/DirectoryContentViewController.swift index 30fe08c..c6c4fb6 100644 --- a/FileExplorer/FileExplorer/DirectoryContentViewController.swift +++ b/FileExplorer/FileExplorer/DirectoryContentViewController.swift @@ -111,6 +111,24 @@ final class DirectoryContentViewController: UICollectionViewController { activeNavigationItemTitle = viewModel.title view.isUserInteractionEnabled = viewModel.isUserInteractionEnabled setEditing(viewModel.isEditing, animated: true) + //get the selection states from the view model and syncronize them + let selectedCellPaths = viewModel.indexPathsOfSelectedCells + for i in 0...viewModel.numberOfItems(inSection: 0) + { + guard let collectionView = collectionView else { return } + let searchIndexPath = IndexPath(item: i, section: 0) + var selectedIndexPath = selectedCellPaths.index(of: searchIndexPath) + var selected = selectedIndexPath != nil ? true : false + if selected + { + collectionView.selectItem(at: searchIndexPath, animated: true, scrollPosition: UICollectionViewScrollPosition.left) + } + else + { + collectionView.deselectItem(at: searchIndexPath, animated: false) + } + } + } override func setEditing(_ editing: Bool, animated: Bool) { diff --git a/FileExplorer/FileExplorer/DirectoryContentViewModel.swift b/FileExplorer/FileExplorer/DirectoryContentViewModel.swift index 627d913..a02e4f3 100644 --- a/FileExplorer/FileExplorer/DirectoryContentViewModel.swift +++ b/FileExplorer/FileExplorer/DirectoryContentViewModel.swift @@ -148,9 +148,10 @@ final class DirectoryContentViewModel { } let numberOfSelectedItemsIsAllowed = configuration.actionsConfiguration.allowsMultipleSelection ? selectedItems.count > 0 : selectedItems.count == 1 + return !fileService.isDeletionInProgress && selectedItemsAreAllowedToBeSelected && numberOfSelectedItemsIsAllowed } - + var selectActionTitle: String { return NSLocalizedString("Choose", comment: "") } @@ -162,7 +163,7 @@ final class DirectoryContentViewModel { private let configuration: Configuration private let fileSpecifications: FileSpecifications private let fileService: FileService - + init(item: LoadedDirectoryItem, fileSpecifications: FileSpecifications, configuration: Configuration, fileService: FileService = LocalStorageFileService()) { self.url = item.url self.fileSpecifications = fileSpecifications @@ -181,7 +182,14 @@ final class DirectoryContentViewModel { func select(at indexPath: IndexPath) { let item = self.item(for: indexPath) if isEditing { - selectedItems.append(item) + if(configuration.actionsConfiguration.allowsMultipleSelection) + { + selectedItems.append(item) + } + else{ + selectedItems.removeAll() + selectedItems.append(item) + } } else { delegate?.directoryViewModel(self, didSelectItem: item) } diff --git a/FileExplorer/FileExplorer/FileExplorerViewController.swift b/FileExplorer/FileExplorer/FileExplorerViewController.swift index 13b3691..9f21b83 100644 --- a/FileExplorer/FileExplorer/FileExplorerViewController.swift +++ b/FileExplorer/FileExplorer/FileExplorerViewController.swift @@ -48,6 +48,9 @@ public final class FileExplorerViewController: UIViewController { /// The URL of directory which is initialy presented by file explorer view controller. public var initialDirectoryURL: URL = URL.documentDirectory + /// A Boolean value indicating whether the user is allowed to remove files. + public var canShareFiles: Bool = true + /// A Boolean value indicating whether the user is allowed to remove files. public var canRemoveFiles: Bool = true @@ -113,7 +116,8 @@ public final class FileExplorerViewController: UIViewController { super.viewWillAppear(animated) let fileSpecifications = FileSpecifications(providers: fileSpecificationProviders) - let actionsConfiguration = ActionsConfiguration(canRemoveFiles: canRemoveFiles, + let actionsConfiguration = ActionsConfiguration(canShareFiles: canShareFiles, + canRemoveFiles: canRemoveFiles, canRemoveDirectories: canRemoveDirectories, canChooseFiles: canChooseFiles, canChooseDirectories: canChooseDirectories, diff --git a/FileExplorer/FileExplorer/FileItemPresentationCoordinator.swift b/FileExplorer/FileExplorer/FileItemPresentationCoordinator.swift index d4721bc..da57725 100644 --- a/FileExplorer/FileExplorer/FileItemPresentationCoordinator.swift +++ b/FileExplorer/FileExplorer/FileItemPresentationCoordinator.swift @@ -32,9 +32,11 @@ final class FileItemPresentationCoordinator { fileprivate weak var navigationController: UINavigationController? fileprivate let fileService: FileService fileprivate let fileSpecifications: FileSpecifications + fileprivate let configuration: Configuration fileprivate let item: Item - init(navigationController: UINavigationController, item: Item, fileSpecifications: FileSpecifications, fileService: FileService = LocalStorageFileService()) { + init(configuration: Configuration, navigationController: UINavigationController, item: Item, fileSpecifications: FileSpecifications, fileService: FileService = LocalStorageFileService()) { + self.configuration = configuration self.navigationController = navigationController self.item = item self.fileSpecifications = fileSpecifications @@ -69,7 +71,7 @@ final class FileItemPresentationCoordinator { private func makePresentingViewController(item: Item, builder: @escaping (LoadedItem) -> UIViewController) -> UIViewController { let viewController = LoadingViewController.make(item: item) { [weak self] loadedItem in let contentViewController = builder(loadedItem) - let actionsViewController = ActionsViewController(contentViewController: contentViewController) + let actionsViewController = ActionsViewController(configuration: self!.configuration, contentViewController: contentViewController) actionsViewController.delegate = self return actionsViewController } diff --git a/FileExplorer/FileExplorer/ItemPresentationCoordinator.swift b/FileExplorer/FileExplorer/ItemPresentationCoordinator.swift index 2750dc2..c08e0db 100644 --- a/FileExplorer/FileExplorer/ItemPresentationCoordinator.swift +++ b/FileExplorer/FileExplorer/ItemPresentationCoordinator.swift @@ -51,7 +51,7 @@ final class ItemPresentationCoordinator { switch item.type { case .file: - let coordinator = FileItemPresentationCoordinator(navigationController: navigationController, item: item, fileSpecifications: fileSpecifications) + let coordinator = FileItemPresentationCoordinator(configuration: configuration, navigationController: navigationController, item: item, fileSpecifications: fileSpecifications) coordinator.start(animated) childCoordinators.append(coordinator) case .directory: @@ -75,7 +75,7 @@ extension ItemPresentationCoordinator: DirectoryItemPresentationCoordinatorDeleg func directoryItemPresentationCoordinator(_ coordinator: DirectoryItemPresentationCoordinator, didSelectItemDetails item: Item) { guard let navigationController = navigationController else { fatalError() } - let coordinator = FileItemPresentationCoordinator(navigationController: navigationController, item: item, fileSpecifications: fileSpecifications) + let coordinator = FileItemPresentationCoordinator(configuration: configuration, navigationController: navigationController, item: item, fileSpecifications: fileSpecifications) childCoordinators.append(coordinator) coordinator.startDetailsPreview(true) } From 70d33772e80af37941479ede52e0284ef9d0f630 Mon Sep 17 00:00:00 2001 From: Timo Steinwender Date: Mon, 27 Feb 2017 17:20:30 +0100 Subject: [PATCH 02/13] Revert "fixed the following things:" This reverts commit 9abba06fca2ff2e5b0a0e5011c6d4324bb4da36f. --- .../FileExplorer/ActionsViewController.swift | 21 +++++++------------ .../FileExplorer/CheckmarkButton.swift | 1 - FileExplorer/FileExplorer/Configuration.swift | 1 - .../DirectoryContentViewController.swift | 18 ---------------- .../DirectoryContentViewModel.swift | 14 +++---------- .../FileExplorerViewController.swift | 6 +----- .../FileItemPresentationCoordinator.swift | 6 ++---- .../ItemPresentationCoordinator.swift | 4 ++-- 8 files changed, 15 insertions(+), 56 deletions(-) diff --git a/FileExplorer/FileExplorer/ActionsViewController.swift b/FileExplorer/FileExplorer/ActionsViewController.swift index 2a06185..aa5e46e 100644 --- a/FileExplorer/FileExplorer/ActionsViewController.swift +++ b/FileExplorer/FileExplorer/ActionsViewController.swift @@ -35,9 +35,8 @@ final class ActionsViewController: UIViewController { private let toolbar = UIToolbar() private let contentViewController: UIViewController - fileprivate let configuration: Configuration - init(configuration: Configuration, contentViewController: UIViewController) { - self.configuration = configuration + + init(contentViewController: UIViewController) { self.contentViewController = contentViewController super.init(nibName: nil, bundle: nil) } @@ -58,17 +57,11 @@ final class ActionsViewController: UIViewController { toolbar.translatesAutoresizingMaskIntoConstraints = false toolbar.sizeToFit() toolbar.pinToBottom(of: view) - //always add the flexibleSpace - toolbar.items = [UIBarButtonItem]() - toolbar.items?.append(UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: self, action: nil)) - if configuration.actionsConfiguration.canShareFiles - { - toolbar.items?.insert(UIBarButtonItem(barButtonSystemItem: .action, target: self, action: #selector(handleShareButtonTap)), at: 0) - } - if configuration.actionsConfiguration.canRemoveFiles - { - toolbar.items?.append(UIBarButtonItem(barButtonSystemItem: .trash, target: self, action: #selector(handleTrashButtonTap))) - } + toolbar.items = [ + UIBarButtonItem(barButtonSystemItem: .action, target: self, action: #selector(handleShareButtonTap)), + UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: self, action: nil), + UIBarButtonItem(barButtonSystemItem: .trash, target: self, action: #selector(handleTrashButtonTap)) + ] addContentChildViewController(contentViewController, insets: UIEdgeInsets(top: 0, left: 0, bottom: toolbar.bounds.height, right: 0)) navigationItem.title = contentViewController.navigationItem.title diff --git a/FileExplorer/FileExplorer/CheckmarkButton.swift b/FileExplorer/FileExplorer/CheckmarkButton.swift index 2522149..64cd7b7 100644 --- a/FileExplorer/FileExplorer/CheckmarkButton.swift +++ b/FileExplorer/FileExplorer/CheckmarkButton.swift @@ -51,7 +51,6 @@ final class CheckmarkButton: UIButton { borderColor = ColorPallete.gray isSelected = false addTarget(self, action: #selector(handleTouchUpInside), for: .touchUpInside) - isUserInteractionEnabled = false } required init?(coder aDecoder: NSCoder) { diff --git a/FileExplorer/FileExplorer/Configuration.swift b/FileExplorer/FileExplorer/Configuration.swift index 5054fe6..4d94b07 100644 --- a/FileExplorer/FileExplorer/Configuration.swift +++ b/FileExplorer/FileExplorer/Configuration.swift @@ -31,7 +31,6 @@ struct Configuration { } struct ActionsConfiguration { - var canShareFiles: Bool = false var canRemoveFiles: Bool = false var canRemoveDirectories: Bool = false var canChooseFiles: Bool = false diff --git a/FileExplorer/FileExplorer/DirectoryContentViewController.swift b/FileExplorer/FileExplorer/DirectoryContentViewController.swift index c6c4fb6..30fe08c 100644 --- a/FileExplorer/FileExplorer/DirectoryContentViewController.swift +++ b/FileExplorer/FileExplorer/DirectoryContentViewController.swift @@ -111,24 +111,6 @@ final class DirectoryContentViewController: UICollectionViewController { activeNavigationItemTitle = viewModel.title view.isUserInteractionEnabled = viewModel.isUserInteractionEnabled setEditing(viewModel.isEditing, animated: true) - //get the selection states from the view model and syncronize them - let selectedCellPaths = viewModel.indexPathsOfSelectedCells - for i in 0...viewModel.numberOfItems(inSection: 0) - { - guard let collectionView = collectionView else { return } - let searchIndexPath = IndexPath(item: i, section: 0) - var selectedIndexPath = selectedCellPaths.index(of: searchIndexPath) - var selected = selectedIndexPath != nil ? true : false - if selected - { - collectionView.selectItem(at: searchIndexPath, animated: true, scrollPosition: UICollectionViewScrollPosition.left) - } - else - { - collectionView.deselectItem(at: searchIndexPath, animated: false) - } - } - } override func setEditing(_ editing: Bool, animated: Bool) { diff --git a/FileExplorer/FileExplorer/DirectoryContentViewModel.swift b/FileExplorer/FileExplorer/DirectoryContentViewModel.swift index a02e4f3..627d913 100644 --- a/FileExplorer/FileExplorer/DirectoryContentViewModel.swift +++ b/FileExplorer/FileExplorer/DirectoryContentViewModel.swift @@ -148,10 +148,9 @@ final class DirectoryContentViewModel { } let numberOfSelectedItemsIsAllowed = configuration.actionsConfiguration.allowsMultipleSelection ? selectedItems.count > 0 : selectedItems.count == 1 - return !fileService.isDeletionInProgress && selectedItemsAreAllowedToBeSelected && numberOfSelectedItemsIsAllowed } - + var selectActionTitle: String { return NSLocalizedString("Choose", comment: "") } @@ -163,7 +162,7 @@ final class DirectoryContentViewModel { private let configuration: Configuration private let fileSpecifications: FileSpecifications private let fileService: FileService - + init(item: LoadedDirectoryItem, fileSpecifications: FileSpecifications, configuration: Configuration, fileService: FileService = LocalStorageFileService()) { self.url = item.url self.fileSpecifications = fileSpecifications @@ -182,14 +181,7 @@ final class DirectoryContentViewModel { func select(at indexPath: IndexPath) { let item = self.item(for: indexPath) if isEditing { - if(configuration.actionsConfiguration.allowsMultipleSelection) - { - selectedItems.append(item) - } - else{ - selectedItems.removeAll() - selectedItems.append(item) - } + selectedItems.append(item) } else { delegate?.directoryViewModel(self, didSelectItem: item) } diff --git a/FileExplorer/FileExplorer/FileExplorerViewController.swift b/FileExplorer/FileExplorer/FileExplorerViewController.swift index 9f21b83..13b3691 100644 --- a/FileExplorer/FileExplorer/FileExplorerViewController.swift +++ b/FileExplorer/FileExplorer/FileExplorerViewController.swift @@ -48,9 +48,6 @@ public final class FileExplorerViewController: UIViewController { /// The URL of directory which is initialy presented by file explorer view controller. public var initialDirectoryURL: URL = URL.documentDirectory - /// A Boolean value indicating whether the user is allowed to remove files. - public var canShareFiles: Bool = true - /// A Boolean value indicating whether the user is allowed to remove files. public var canRemoveFiles: Bool = true @@ -116,8 +113,7 @@ public final class FileExplorerViewController: UIViewController { super.viewWillAppear(animated) let fileSpecifications = FileSpecifications(providers: fileSpecificationProviders) - let actionsConfiguration = ActionsConfiguration(canShareFiles: canShareFiles, - canRemoveFiles: canRemoveFiles, + let actionsConfiguration = ActionsConfiguration(canRemoveFiles: canRemoveFiles, canRemoveDirectories: canRemoveDirectories, canChooseFiles: canChooseFiles, canChooseDirectories: canChooseDirectories, diff --git a/FileExplorer/FileExplorer/FileItemPresentationCoordinator.swift b/FileExplorer/FileExplorer/FileItemPresentationCoordinator.swift index da57725..d4721bc 100644 --- a/FileExplorer/FileExplorer/FileItemPresentationCoordinator.swift +++ b/FileExplorer/FileExplorer/FileItemPresentationCoordinator.swift @@ -32,11 +32,9 @@ final class FileItemPresentationCoordinator { fileprivate weak var navigationController: UINavigationController? fileprivate let fileService: FileService fileprivate let fileSpecifications: FileSpecifications - fileprivate let configuration: Configuration fileprivate let item: Item - init(configuration: Configuration, navigationController: UINavigationController, item: Item, fileSpecifications: FileSpecifications, fileService: FileService = LocalStorageFileService()) { - self.configuration = configuration + init(navigationController: UINavigationController, item: Item, fileSpecifications: FileSpecifications, fileService: FileService = LocalStorageFileService()) { self.navigationController = navigationController self.item = item self.fileSpecifications = fileSpecifications @@ -71,7 +69,7 @@ final class FileItemPresentationCoordinator { private func makePresentingViewController(item: Item, builder: @escaping (LoadedItem) -> UIViewController) -> UIViewController { let viewController = LoadingViewController.make(item: item) { [weak self] loadedItem in let contentViewController = builder(loadedItem) - let actionsViewController = ActionsViewController(configuration: self!.configuration, contentViewController: contentViewController) + let actionsViewController = ActionsViewController(contentViewController: contentViewController) actionsViewController.delegate = self return actionsViewController } diff --git a/FileExplorer/FileExplorer/ItemPresentationCoordinator.swift b/FileExplorer/FileExplorer/ItemPresentationCoordinator.swift index c08e0db..2750dc2 100644 --- a/FileExplorer/FileExplorer/ItemPresentationCoordinator.swift +++ b/FileExplorer/FileExplorer/ItemPresentationCoordinator.swift @@ -51,7 +51,7 @@ final class ItemPresentationCoordinator { switch item.type { case .file: - let coordinator = FileItemPresentationCoordinator(configuration: configuration, navigationController: navigationController, item: item, fileSpecifications: fileSpecifications) + let coordinator = FileItemPresentationCoordinator(navigationController: navigationController, item: item, fileSpecifications: fileSpecifications) coordinator.start(animated) childCoordinators.append(coordinator) case .directory: @@ -75,7 +75,7 @@ extension ItemPresentationCoordinator: DirectoryItemPresentationCoordinatorDeleg func directoryItemPresentationCoordinator(_ coordinator: DirectoryItemPresentationCoordinator, didSelectItemDetails item: Item) { guard let navigationController = navigationController else { fatalError() } - let coordinator = FileItemPresentationCoordinator(configuration: configuration, navigationController: navigationController, item: item, fileSpecifications: fileSpecifications) + let coordinator = FileItemPresentationCoordinator(navigationController: navigationController, item: item, fileSpecifications: fileSpecifications) childCoordinators.append(coordinator) coordinator.startDetailsPreview(true) } From 11efbf28e1262a828d5af496248c26c48c88b40f Mon Sep 17 00:00:00 2001 From: Timo Steinwender Date: Mon, 27 Feb 2017 17:22:56 +0100 Subject: [PATCH 03/13] fixed the following things: 1. added property to disable the file sharing button 2. canRemoveFiles will remove the removeButton in the preview section 3. disabled userInteraction for the check button to handle the selection only over the cell 4. if allowMultipleSelection is disabled: only select one item to avoid misunderstanding --- .../FileExplorer/ActionsViewController.swift | 21 ++++++++++++------- .../FileExplorer/CheckmarkButton.swift | 1 + FileExplorer/FileExplorer/Configuration.swift | 1 + .../DirectoryContentViewController.swift | 18 ++++++++++++++++ .../DirectoryContentViewModel.swift | 14 ++++++++++--- .../FileExplorerViewController.swift | 6 +++++- .../FileItemPresentationCoordinator.swift | 6 ++++-- .../ItemPresentationCoordinator.swift | 4 ++-- 8 files changed, 56 insertions(+), 15 deletions(-) diff --git a/FileExplorer/FileExplorer/ActionsViewController.swift b/FileExplorer/FileExplorer/ActionsViewController.swift index aa5e46e..2a06185 100644 --- a/FileExplorer/FileExplorer/ActionsViewController.swift +++ b/FileExplorer/FileExplorer/ActionsViewController.swift @@ -35,8 +35,9 @@ final class ActionsViewController: UIViewController { private let toolbar = UIToolbar() private let contentViewController: UIViewController - - init(contentViewController: UIViewController) { + fileprivate let configuration: Configuration + init(configuration: Configuration, contentViewController: UIViewController) { + self.configuration = configuration self.contentViewController = contentViewController super.init(nibName: nil, bundle: nil) } @@ -57,11 +58,17 @@ final class ActionsViewController: UIViewController { toolbar.translatesAutoresizingMaskIntoConstraints = false toolbar.sizeToFit() toolbar.pinToBottom(of: view) - toolbar.items = [ - UIBarButtonItem(barButtonSystemItem: .action, target: self, action: #selector(handleShareButtonTap)), - UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: self, action: nil), - UIBarButtonItem(barButtonSystemItem: .trash, target: self, action: #selector(handleTrashButtonTap)) - ] + //always add the flexibleSpace + toolbar.items = [UIBarButtonItem]() + toolbar.items?.append(UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: self, action: nil)) + if configuration.actionsConfiguration.canShareFiles + { + toolbar.items?.insert(UIBarButtonItem(barButtonSystemItem: .action, target: self, action: #selector(handleShareButtonTap)), at: 0) + } + if configuration.actionsConfiguration.canRemoveFiles + { + toolbar.items?.append(UIBarButtonItem(barButtonSystemItem: .trash, target: self, action: #selector(handleTrashButtonTap))) + } addContentChildViewController(contentViewController, insets: UIEdgeInsets(top: 0, left: 0, bottom: toolbar.bounds.height, right: 0)) navigationItem.title = contentViewController.navigationItem.title diff --git a/FileExplorer/FileExplorer/CheckmarkButton.swift b/FileExplorer/FileExplorer/CheckmarkButton.swift index 64cd7b7..2522149 100644 --- a/FileExplorer/FileExplorer/CheckmarkButton.swift +++ b/FileExplorer/FileExplorer/CheckmarkButton.swift @@ -51,6 +51,7 @@ final class CheckmarkButton: UIButton { borderColor = ColorPallete.gray isSelected = false addTarget(self, action: #selector(handleTouchUpInside), for: .touchUpInside) + isUserInteractionEnabled = false } required init?(coder aDecoder: NSCoder) { diff --git a/FileExplorer/FileExplorer/Configuration.swift b/FileExplorer/FileExplorer/Configuration.swift index 4d94b07..5054fe6 100644 --- a/FileExplorer/FileExplorer/Configuration.swift +++ b/FileExplorer/FileExplorer/Configuration.swift @@ -31,6 +31,7 @@ struct Configuration { } struct ActionsConfiguration { + var canShareFiles: Bool = false var canRemoveFiles: Bool = false var canRemoveDirectories: Bool = false var canChooseFiles: Bool = false diff --git a/FileExplorer/FileExplorer/DirectoryContentViewController.swift b/FileExplorer/FileExplorer/DirectoryContentViewController.swift index 30fe08c..c6c4fb6 100644 --- a/FileExplorer/FileExplorer/DirectoryContentViewController.swift +++ b/FileExplorer/FileExplorer/DirectoryContentViewController.swift @@ -111,6 +111,24 @@ final class DirectoryContentViewController: UICollectionViewController { activeNavigationItemTitle = viewModel.title view.isUserInteractionEnabled = viewModel.isUserInteractionEnabled setEditing(viewModel.isEditing, animated: true) + //get the selection states from the view model and syncronize them + let selectedCellPaths = viewModel.indexPathsOfSelectedCells + for i in 0...viewModel.numberOfItems(inSection: 0) + { + guard let collectionView = collectionView else { return } + let searchIndexPath = IndexPath(item: i, section: 0) + var selectedIndexPath = selectedCellPaths.index(of: searchIndexPath) + var selected = selectedIndexPath != nil ? true : false + if selected + { + collectionView.selectItem(at: searchIndexPath, animated: true, scrollPosition: UICollectionViewScrollPosition.left) + } + else + { + collectionView.deselectItem(at: searchIndexPath, animated: false) + } + } + } override func setEditing(_ editing: Bool, animated: Bool) { diff --git a/FileExplorer/FileExplorer/DirectoryContentViewModel.swift b/FileExplorer/FileExplorer/DirectoryContentViewModel.swift index 627d913..a02e4f3 100644 --- a/FileExplorer/FileExplorer/DirectoryContentViewModel.swift +++ b/FileExplorer/FileExplorer/DirectoryContentViewModel.swift @@ -148,9 +148,10 @@ final class DirectoryContentViewModel { } let numberOfSelectedItemsIsAllowed = configuration.actionsConfiguration.allowsMultipleSelection ? selectedItems.count > 0 : selectedItems.count == 1 + return !fileService.isDeletionInProgress && selectedItemsAreAllowedToBeSelected && numberOfSelectedItemsIsAllowed } - + var selectActionTitle: String { return NSLocalizedString("Choose", comment: "") } @@ -162,7 +163,7 @@ final class DirectoryContentViewModel { private let configuration: Configuration private let fileSpecifications: FileSpecifications private let fileService: FileService - + init(item: LoadedDirectoryItem, fileSpecifications: FileSpecifications, configuration: Configuration, fileService: FileService = LocalStorageFileService()) { self.url = item.url self.fileSpecifications = fileSpecifications @@ -181,7 +182,14 @@ final class DirectoryContentViewModel { func select(at indexPath: IndexPath) { let item = self.item(for: indexPath) if isEditing { - selectedItems.append(item) + if(configuration.actionsConfiguration.allowsMultipleSelection) + { + selectedItems.append(item) + } + else{ + selectedItems.removeAll() + selectedItems.append(item) + } } else { delegate?.directoryViewModel(self, didSelectItem: item) } diff --git a/FileExplorer/FileExplorer/FileExplorerViewController.swift b/FileExplorer/FileExplorer/FileExplorerViewController.swift index 13b3691..9f21b83 100644 --- a/FileExplorer/FileExplorer/FileExplorerViewController.swift +++ b/FileExplorer/FileExplorer/FileExplorerViewController.swift @@ -48,6 +48,9 @@ public final class FileExplorerViewController: UIViewController { /// The URL of directory which is initialy presented by file explorer view controller. public var initialDirectoryURL: URL = URL.documentDirectory + /// A Boolean value indicating whether the user is allowed to remove files. + public var canShareFiles: Bool = true + /// A Boolean value indicating whether the user is allowed to remove files. public var canRemoveFiles: Bool = true @@ -113,7 +116,8 @@ public final class FileExplorerViewController: UIViewController { super.viewWillAppear(animated) let fileSpecifications = FileSpecifications(providers: fileSpecificationProviders) - let actionsConfiguration = ActionsConfiguration(canRemoveFiles: canRemoveFiles, + let actionsConfiguration = ActionsConfiguration(canShareFiles: canShareFiles, + canRemoveFiles: canRemoveFiles, canRemoveDirectories: canRemoveDirectories, canChooseFiles: canChooseFiles, canChooseDirectories: canChooseDirectories, diff --git a/FileExplorer/FileExplorer/FileItemPresentationCoordinator.swift b/FileExplorer/FileExplorer/FileItemPresentationCoordinator.swift index d4721bc..da57725 100644 --- a/FileExplorer/FileExplorer/FileItemPresentationCoordinator.swift +++ b/FileExplorer/FileExplorer/FileItemPresentationCoordinator.swift @@ -32,9 +32,11 @@ final class FileItemPresentationCoordinator { fileprivate weak var navigationController: UINavigationController? fileprivate let fileService: FileService fileprivate let fileSpecifications: FileSpecifications + fileprivate let configuration: Configuration fileprivate let item: Item - init(navigationController: UINavigationController, item: Item, fileSpecifications: FileSpecifications, fileService: FileService = LocalStorageFileService()) { + init(configuration: Configuration, navigationController: UINavigationController, item: Item, fileSpecifications: FileSpecifications, fileService: FileService = LocalStorageFileService()) { + self.configuration = configuration self.navigationController = navigationController self.item = item self.fileSpecifications = fileSpecifications @@ -69,7 +71,7 @@ final class FileItemPresentationCoordinator { private func makePresentingViewController(item: Item, builder: @escaping (LoadedItem) -> UIViewController) -> UIViewController { let viewController = LoadingViewController.make(item: item) { [weak self] loadedItem in let contentViewController = builder(loadedItem) - let actionsViewController = ActionsViewController(contentViewController: contentViewController) + let actionsViewController = ActionsViewController(configuration: self!.configuration, contentViewController: contentViewController) actionsViewController.delegate = self return actionsViewController } diff --git a/FileExplorer/FileExplorer/ItemPresentationCoordinator.swift b/FileExplorer/FileExplorer/ItemPresentationCoordinator.swift index 2750dc2..c08e0db 100644 --- a/FileExplorer/FileExplorer/ItemPresentationCoordinator.swift +++ b/FileExplorer/FileExplorer/ItemPresentationCoordinator.swift @@ -51,7 +51,7 @@ final class ItemPresentationCoordinator { switch item.type { case .file: - let coordinator = FileItemPresentationCoordinator(navigationController: navigationController, item: item, fileSpecifications: fileSpecifications) + let coordinator = FileItemPresentationCoordinator(configuration: configuration, navigationController: navigationController, item: item, fileSpecifications: fileSpecifications) coordinator.start(animated) childCoordinators.append(coordinator) case .directory: @@ -75,7 +75,7 @@ extension ItemPresentationCoordinator: DirectoryItemPresentationCoordinatorDeleg func directoryItemPresentationCoordinator(_ coordinator: DirectoryItemPresentationCoordinator, didSelectItemDetails item: Item) { guard let navigationController = navigationController else { fatalError() } - let coordinator = FileItemPresentationCoordinator(navigationController: navigationController, item: item, fileSpecifications: fileSpecifications) + let coordinator = FileItemPresentationCoordinator(configuration: configuration, navigationController: navigationController, item: item, fileSpecifications: fileSpecifications) childCoordinators.append(coordinator) coordinator.startDetailsPreview(true) } From 917aea546ac5918be0f7e003827af3b74fbd685f Mon Sep 17 00:00:00 2001 From: Timo Steinwender Date: Mon, 27 Feb 2017 17:45:10 +0100 Subject: [PATCH 04/13] changed version to 1.0.41 --- FileExplorer.podspec.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/FileExplorer.podspec.json b/FileExplorer.podspec.json index 40aac70..e0c2224 100644 --- a/FileExplorer.podspec.json +++ b/FileExplorer.podspec.json @@ -1,6 +1,6 @@ { "name": "FileExplorer", - "version": "1.0.4", + "version": "1.0.41", "summary": "FileExplorer is a powerful iOS file browser with the possiblity to choose and remove files and/or directories", "homepage": "https://github.com/Augustyniak/FileExplorer", "screenshots": "https://raw.github.com/Augustyniak/FileExplorer/master/Resources/Directories.gif", @@ -12,8 +12,8 @@ "Rafal Augustyniak": "rafalaugustyniak@gmail.com" }, "source": { - "git": "https://github.com/Augustyniak/FileExplorer.git", - "tag": "v1.0.4" + "git": "https://github.com/GitHubKsti/FileExplorer.git", + "tag": "v1.0.41" }, "platforms": { "ios": "9.0" From a49a30616e9d2e4e43be2be10816de0915d1d5dd Mon Sep 17 00:00:00 2001 From: Timo Steinwender Date: Mon, 27 Feb 2017 18:22:40 +0100 Subject: [PATCH 05/13] fixed warnings --- .../FileExplorer/DirectoryContentViewController.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/FileExplorer/FileExplorer/DirectoryContentViewController.swift b/FileExplorer/FileExplorer/DirectoryContentViewController.swift index c6c4fb6..153ec6e 100644 --- a/FileExplorer/FileExplorer/DirectoryContentViewController.swift +++ b/FileExplorer/FileExplorer/DirectoryContentViewController.swift @@ -117,8 +117,8 @@ final class DirectoryContentViewController: UICollectionViewController { { guard let collectionView = collectionView else { return } let searchIndexPath = IndexPath(item: i, section: 0) - var selectedIndexPath = selectedCellPaths.index(of: searchIndexPath) - var selected = selectedIndexPath != nil ? true : false + let selectedIndexPath = selectedCellPaths.index(of: searchIndexPath) + let selected = selectedIndexPath != nil ? true : false if selected { collectionView.selectItem(at: searchIndexPath, animated: true, scrollPosition: UICollectionViewScrollPosition.left) From a69e36d1fa46865e37879b9fc101e39ace5ba9c6 Mon Sep 17 00:00:00 2001 From: Timo Steinwender Date: Tue, 28 Feb 2017 14:40:52 +0100 Subject: [PATCH 06/13] fixed bug in the model because the wrong index was used for determining the selection state --- FileExplorer/FileExplorer/DirectoryContentViewModel.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FileExplorer/FileExplorer/DirectoryContentViewModel.swift b/FileExplorer/FileExplorer/DirectoryContentViewModel.swift index a02e4f3..efed8fd 100644 --- a/FileExplorer/FileExplorer/DirectoryContentViewModel.swift +++ b/FileExplorer/FileExplorer/DirectoryContentViewModel.swift @@ -241,7 +241,7 @@ final class DirectoryContentViewModel { } private func index(for item: Item) -> IndexPath { - for (i, iterItem) in allItems.enumerated() { + for (i, iterItem) in itemsToDisplay.enumerated() { if iterItem == item { return IndexPath(item: i, section: 0) } From a1882278182aaab0b505716b0ad1cdf5c4fbe4be Mon Sep 17 00:00:00 2001 From: Martin Labsch Date: Fri, 2 Jun 2017 17:45:41 +0200 Subject: [PATCH 07/13] protocol extended: if user tries to delete files, the list of that files ('shouldRemoveItems') is accessible before deleting, so that further processing is customizable --- .../DirectoryContentViewController.swift | 34 +++++++++++++------ ...DirectoryItemPresentationCoordinator.swift | 5 +++ .../DirectoryViewController.swift | 5 +++ .../FileExplorerViewController.swift | 23 +++++++++++++ .../FileItemPresentationCoordinator.swift | 1 + .../ItemPresentationCoordinator.swift | 6 ++++ 6 files changed, 64 insertions(+), 10 deletions(-) diff --git a/FileExplorer/FileExplorer/DirectoryContentViewController.swift b/FileExplorer/FileExplorer/DirectoryContentViewController.swift index 153ec6e..7f28cfb 100644 --- a/FileExplorer/FileExplorer/DirectoryContentViewController.swift +++ b/FileExplorer/FileExplorer/DirectoryContentViewController.swift @@ -30,6 +30,7 @@ protocol DirectoryContentViewControllerDelegate: class { func directoryContentViewController(_ controller: DirectoryContentViewController, didSelectItem item: Item) func directoryContentViewController(_ controller: DirectoryContentViewController, didSelectItemDetails item: Item) func directoryContentViewController(_ controller: DirectoryContentViewController, didChooseItems items: [Item]) + func directoryContentViewController(_ controller: DirectoryContentViewController, shouldRemoveItems: [Item], removeItemsHandler:(([Item])->Void)) } final class DirectoryContentViewController: UICollectionViewController { @@ -176,16 +177,29 @@ final class DirectoryContentViewController: UICollectionViewController { func handleDeleteButtonTap() { showLoadingIndicator() - viewModel.deleteItems(at: viewModel.indexPathsOfSelectedCells) { [weak self] result in - guard let strongSelf = self else { return } - strongSelf.hideLoadingIndicator() - - if case .error(let error) = result { - UIAlertController.presentAlert(for: error, in: strongSelf) - } - - strongSelf.viewModel.isEditing = false - strongSelf.delegate?.directoryContentViewController(strongSelf, didChangeEditingStatus: strongSelf.viewModel.isEditing) + viewModel.chooseItems { selectedItems in + let indexPaths = viewModel.indexPathsOfSelectedCells + delegate?.directoryContentViewController(self, shouldRemoveItems:selectedItems, removeItemsHandler:{(itemsToRemove)->Void in + var indexPathsToRemove = [IndexPath]() + for item in itemsToRemove + { + if let index = selectedItems.index(where: { $0 == item }) + { + indexPathsToRemove.append(indexPaths[index]) + } + } + viewModel.deleteItems(at: indexPathsToRemove) { [weak self] result in + guard let strongSelf = self else { return } + strongSelf.hideLoadingIndicator() + + if case .error(let error) = result { + UIAlertController.presentAlert(for: error, in: strongSelf) + } + + strongSelf.viewModel.isEditing = false + strongSelf.delegate?.directoryContentViewController(strongSelf, didChangeEditingStatus: strongSelf.viewModel.isEditing) + } + }) } } diff --git a/FileExplorer/FileExplorer/DirectoryItemPresentationCoordinator.swift b/FileExplorer/FileExplorer/DirectoryItemPresentationCoordinator.swift index a8c5346..0ac02e8 100644 --- a/FileExplorer/FileExplorer/DirectoryItemPresentationCoordinator.swift +++ b/FileExplorer/FileExplorer/DirectoryItemPresentationCoordinator.swift @@ -29,6 +29,7 @@ protocol DirectoryItemPresentationCoordinatorDelegate: class { func directoryItemPresentationCoordinator(_ coordinator: DirectoryItemPresentationCoordinator, didSelectItem item: Item) func directoryItemPresentationCoordinator(_ coordinator: DirectoryItemPresentationCoordinator, didSelectItemDetails item: Item) func directoryItemPresentationCoordinator(_ coordinator: DirectoryItemPresentationCoordinator, didChooseItems items: [Item]) + func directoryItemPresentationCoordinator(_ coordinator: DirectoryItemPresentationCoordinator, shouldRemoveItems items: [Item], removeItemsHandler: (([Item])->Void)) func directoryItemPresentationCoordinatorDidFinish(_ coordinator: DirectoryItemPresentationCoordinator) } @@ -76,6 +77,10 @@ final class DirectoryItemPresentationCoordinator { } extension DirectoryItemPresentationCoordinator: DirectoryViewControllerDelegate { + func directoryViewController(_ controller: DirectoryViewController, shouldRemoveItems items: [Item], removeItemsHandler: (([Item]) -> Void)) { + delegate?.directoryItemPresentationCoordinator(self, shouldRemoveItems: items, removeItemsHandler: removeItemsHandler) + } + func directoryViewController(_ controller: DirectoryViewController, didSelectItem item: Item) { directoryViewController?.isSearchControllerActive = false delegate?.directoryItemPresentationCoordinator(self, didSelectItem: item) diff --git a/FileExplorer/FileExplorer/DirectoryViewController.swift b/FileExplorer/FileExplorer/DirectoryViewController.swift index 84ee28e..b738f79 100644 --- a/FileExplorer/FileExplorer/DirectoryViewController.swift +++ b/FileExplorer/FileExplorer/DirectoryViewController.swift @@ -58,6 +58,7 @@ protocol DirectoryViewControllerDelegate: class { func directoryViewController(_ controller: DirectoryViewController, didSelectItem item: Item) func directoryViewController(_ controller: DirectoryViewController, didSelectItemDetails item: Item) func directoryViewController(_ controller: DirectoryViewController, didChooseItems items: [Item]) + func directoryViewController(_ controller: DirectoryViewController, shouldRemoveItems items: [Item], removeItemsHandler: (([Item])->Void)) func directoryViewControllerDidFinish(_ controller: DirectoryViewController) } @@ -147,6 +148,10 @@ extension DirectoryViewController: UISearchBarDelegate { } extension DirectoryViewController: DirectoryContentViewControllerDelegate { + internal func directoryContentViewController(_ controller: DirectoryContentViewController, shouldRemoveItems: [Item], removeItemsHandler: (([Item]) -> Void)) { + delegate?.directoryViewController(self, shouldRemoveItems: shouldRemoveItems, removeItemsHandler:removeItemsHandler) + } + func directoryContentViewController(_ controller: DirectoryContentViewController, didChangeEditingStatus isEditing: Bool) { searchController.searchBar.isEnabled = !isEditing } diff --git a/FileExplorer/FileExplorer/FileExplorerViewController.swift b/FileExplorer/FileExplorer/FileExplorerViewController.swift index 9f21b83..e49c12e 100644 --- a/FileExplorer/FileExplorer/FileExplorerViewController.swift +++ b/FileExplorer/FileExplorer/FileExplorerViewController.swift @@ -40,6 +40,9 @@ public protocol FileExplorerViewControllerDelegate: class { /// - controller: The controller object managing the file explorer interface. /// - urls: URLs choosen by users. func fileExplorerViewController(_ controller: FileExplorerViewController, didChooseURLs urls: [URL]) + //the handler will return the urls which can be removed + //NOTE: the result URL array can be empty + func fileExplorerViewController(controller: FileExplorerViewController, shouldRemoveURLs urls: [URL], handler: (([URL]) -> Void)) } /// The FileExplorerViewController class manages customizable for displaying, removing and choosing files and directories stored in local storage of the device in your app. A file explorer view controller manages user interactions and delivers the results of those interactions to a delegate object. @@ -149,4 +152,24 @@ extension FileExplorerViewController: ItemPresentationCoordinatorDelegate { let urls = items.map { $0.url } delegate?.fileExplorerViewController(self, didChooseURLs: urls) } + + func itemPresentationCoordinator(_ coordinator: ItemPresentationCoordinator, shouldRemoveItems items: [Item], removeItemsHandler: (_ removeItems:[Item]) -> Void) + { + let urls = items.map { $0.url } + delegate?.fileExplorerViewController(controller: self, shouldRemoveURLs: urls, handler: { (filesToRemove) -> Void in + var resultArray = [Item] () + for fileUrl in filesToRemove + { + for item in items + { + if item.url == fileUrl + { + resultArray.append(item) + } + } + } + removeItemsHandler(resultArray) + }) + + } } diff --git a/FileExplorer/FileExplorer/FileItemPresentationCoordinator.swift b/FileExplorer/FileExplorer/FileItemPresentationCoordinator.swift index da57725..a88347e 100644 --- a/FileExplorer/FileExplorer/FileItemPresentationCoordinator.swift +++ b/FileExplorer/FileExplorer/FileItemPresentationCoordinator.swift @@ -83,6 +83,7 @@ extension FileItemPresentationCoordinator: ActionsViewControllerDelegate { func actionsViewControllerDidRequestShare(_ controller: ActionsViewController) { let activityItem = UIActivityItemProvider(placeholderItem: item.url) let activityViewController = UIActivityViewController(activityItems: [activityItem], applicationActivities: nil) + activityViewController.popoverPresentationController?.sourceView = navigationController?.view navigationController?.present(activityViewController, animated: true, completion: nil) } diff --git a/FileExplorer/FileExplorer/ItemPresentationCoordinator.swift b/FileExplorer/FileExplorer/ItemPresentationCoordinator.swift index c08e0db..1e1ece5 100644 --- a/FileExplorer/FileExplorer/ItemPresentationCoordinator.swift +++ b/FileExplorer/FileExplorer/ItemPresentationCoordinator.swift @@ -30,6 +30,7 @@ import AVFoundation protocol ItemPresentationCoordinatorDelegate: class { func itemPresentationCoordinatorDidFinish(_ coordinator: ItemPresentationCoordinator) func itemPresentationCoordinator(_ coordinator: ItemPresentationCoordinator, didChooseItems items: [Item]) + func itemPresentationCoordinator(_ coordinator: ItemPresentationCoordinator, shouldRemoveItems items: [Item], removeItemsHandler: (([Item]) -> Void)) } final class ItemPresentationCoordinator { @@ -87,4 +88,9 @@ extension ItemPresentationCoordinator: DirectoryItemPresentationCoordinatorDeleg func directoryItemPresentationCoordinatorDidFinish(_ coordinator: DirectoryItemPresentationCoordinator) { delegate?.itemPresentationCoordinatorDidFinish(self) } + internal func directoryItemPresentationCoordinator(_ coordinator: DirectoryItemPresentationCoordinator, shouldRemoveItems items: [Item], removeItemsHandler: (([Item]) -> Void)) { + delegate?.itemPresentationCoordinator(self, shouldRemoveItems: items, removeItemsHandler: {(itemsToRemove) -> Void in + removeItemsHandler(itemsToRemove) + }) + } } From ce8f399e3752a339416ac512d2fd674d92d11609 Mon Sep 17 00:00:00 2001 From: Martin Labsch Date: Fri, 2 Jun 2017 18:11:16 +0200 Subject: [PATCH 08/13] protocol extension from last commit is working now --- .../FileExplorer/DirectoryContentViewController.swift | 4 ++-- .../FileExplorer/DirectoryItemPresentationCoordinator.swift | 4 ++-- FileExplorer/FileExplorer/DirectoryViewController.swift | 4 ++-- FileExplorer/FileExplorer/FileExplorerViewController.swift | 4 ++-- FileExplorer/FileExplorer/ItemPresentationCoordinator.swift | 5 +++-- 5 files changed, 11 insertions(+), 10 deletions(-) diff --git a/FileExplorer/FileExplorer/DirectoryContentViewController.swift b/FileExplorer/FileExplorer/DirectoryContentViewController.swift index 7f28cfb..65f096f 100644 --- a/FileExplorer/FileExplorer/DirectoryContentViewController.swift +++ b/FileExplorer/FileExplorer/DirectoryContentViewController.swift @@ -30,7 +30,7 @@ protocol DirectoryContentViewControllerDelegate: class { func directoryContentViewController(_ controller: DirectoryContentViewController, didSelectItem item: Item) func directoryContentViewController(_ controller: DirectoryContentViewController, didSelectItemDetails item: Item) func directoryContentViewController(_ controller: DirectoryContentViewController, didChooseItems items: [Item]) - func directoryContentViewController(_ controller: DirectoryContentViewController, shouldRemoveItems: [Item], removeItemsHandler:(([Item])->Void)) + func directoryContentViewController(_ controller: DirectoryContentViewController, shouldRemoveItems: [Item], removeItemsHandler: @escaping (([Item])->Void)) } final class DirectoryContentViewController: UICollectionViewController { @@ -188,7 +188,7 @@ final class DirectoryContentViewController: UICollectionViewController { indexPathsToRemove.append(indexPaths[index]) } } - viewModel.deleteItems(at: indexPathsToRemove) { [weak self] result in + self.viewModel.deleteItems(at: indexPathsToRemove) { [weak self] result in guard let strongSelf = self else { return } strongSelf.hideLoadingIndicator() diff --git a/FileExplorer/FileExplorer/DirectoryItemPresentationCoordinator.swift b/FileExplorer/FileExplorer/DirectoryItemPresentationCoordinator.swift index 0ac02e8..9a66b40 100644 --- a/FileExplorer/FileExplorer/DirectoryItemPresentationCoordinator.swift +++ b/FileExplorer/FileExplorer/DirectoryItemPresentationCoordinator.swift @@ -29,7 +29,7 @@ protocol DirectoryItemPresentationCoordinatorDelegate: class { func directoryItemPresentationCoordinator(_ coordinator: DirectoryItemPresentationCoordinator, didSelectItem item: Item) func directoryItemPresentationCoordinator(_ coordinator: DirectoryItemPresentationCoordinator, didSelectItemDetails item: Item) func directoryItemPresentationCoordinator(_ coordinator: DirectoryItemPresentationCoordinator, didChooseItems items: [Item]) - func directoryItemPresentationCoordinator(_ coordinator: DirectoryItemPresentationCoordinator, shouldRemoveItems items: [Item], removeItemsHandler: (([Item])->Void)) + func directoryItemPresentationCoordinator(_ coordinator: DirectoryItemPresentationCoordinator, shouldRemoveItems items: [Item], removeItemsHandler: @escaping (([Item])->Void)) func directoryItemPresentationCoordinatorDidFinish(_ coordinator: DirectoryItemPresentationCoordinator) } @@ -77,7 +77,7 @@ final class DirectoryItemPresentationCoordinator { } extension DirectoryItemPresentationCoordinator: DirectoryViewControllerDelegate { - func directoryViewController(_ controller: DirectoryViewController, shouldRemoveItems items: [Item], removeItemsHandler: (([Item]) -> Void)) { + func directoryViewController(_ controller: DirectoryViewController, shouldRemoveItems items: [Item], removeItemsHandler: @escaping (([Item]) -> Void)) { delegate?.directoryItemPresentationCoordinator(self, shouldRemoveItems: items, removeItemsHandler: removeItemsHandler) } diff --git a/FileExplorer/FileExplorer/DirectoryViewController.swift b/FileExplorer/FileExplorer/DirectoryViewController.swift index b738f79..7cfb8cc 100644 --- a/FileExplorer/FileExplorer/DirectoryViewController.swift +++ b/FileExplorer/FileExplorer/DirectoryViewController.swift @@ -58,7 +58,7 @@ protocol DirectoryViewControllerDelegate: class { func directoryViewController(_ controller: DirectoryViewController, didSelectItem item: Item) func directoryViewController(_ controller: DirectoryViewController, didSelectItemDetails item: Item) func directoryViewController(_ controller: DirectoryViewController, didChooseItems items: [Item]) - func directoryViewController(_ controller: DirectoryViewController, shouldRemoveItems items: [Item], removeItemsHandler: (([Item])->Void)) + func directoryViewController(_ controller: DirectoryViewController, shouldRemoveItems items: [Item], removeItemsHandler: @escaping (([Item])->Void)) func directoryViewControllerDidFinish(_ controller: DirectoryViewController) } @@ -148,7 +148,7 @@ extension DirectoryViewController: UISearchBarDelegate { } extension DirectoryViewController: DirectoryContentViewControllerDelegate { - internal func directoryContentViewController(_ controller: DirectoryContentViewController, shouldRemoveItems: [Item], removeItemsHandler: (([Item]) -> Void)) { + internal func directoryContentViewController(_ controller: DirectoryContentViewController, shouldRemoveItems: [Item], removeItemsHandler: @escaping (([Item]) -> Void)) { delegate?.directoryViewController(self, shouldRemoveItems: shouldRemoveItems, removeItemsHandler:removeItemsHandler) } diff --git a/FileExplorer/FileExplorer/FileExplorerViewController.swift b/FileExplorer/FileExplorer/FileExplorerViewController.swift index e49c12e..ebeac34 100644 --- a/FileExplorer/FileExplorer/FileExplorerViewController.swift +++ b/FileExplorer/FileExplorer/FileExplorerViewController.swift @@ -42,7 +42,7 @@ public protocol FileExplorerViewControllerDelegate: class { func fileExplorerViewController(_ controller: FileExplorerViewController, didChooseURLs urls: [URL]) //the handler will return the urls which can be removed //NOTE: the result URL array can be empty - func fileExplorerViewController(controller: FileExplorerViewController, shouldRemoveURLs urls: [URL], handler: (([URL]) -> Void)) + func fileExplorerViewController(controller: FileExplorerViewController, shouldRemoveURLs urls: [URL], handler: @escaping (([URL]) -> Void)) } /// The FileExplorerViewController class manages customizable for displaying, removing and choosing files and directories stored in local storage of the device in your app. A file explorer view controller manages user interactions and delivers the results of those interactions to a delegate object. @@ -153,7 +153,7 @@ extension FileExplorerViewController: ItemPresentationCoordinatorDelegate { delegate?.fileExplorerViewController(self, didChooseURLs: urls) } - func itemPresentationCoordinator(_ coordinator: ItemPresentationCoordinator, shouldRemoveItems items: [Item], removeItemsHandler: (_ removeItems:[Item]) -> Void) + func itemPresentationCoordinator(_ coordinator: ItemPresentationCoordinator, shouldRemoveItems items: [Item], removeItemsHandler: @escaping (_ removeItems:[Item]) -> Void) { let urls = items.map { $0.url } delegate?.fileExplorerViewController(controller: self, shouldRemoveURLs: urls, handler: { (filesToRemove) -> Void in diff --git a/FileExplorer/FileExplorer/ItemPresentationCoordinator.swift b/FileExplorer/FileExplorer/ItemPresentationCoordinator.swift index 1e1ece5..9c51f35 100644 --- a/FileExplorer/FileExplorer/ItemPresentationCoordinator.swift +++ b/FileExplorer/FileExplorer/ItemPresentationCoordinator.swift @@ -30,7 +30,7 @@ import AVFoundation protocol ItemPresentationCoordinatorDelegate: class { func itemPresentationCoordinatorDidFinish(_ coordinator: ItemPresentationCoordinator) func itemPresentationCoordinator(_ coordinator: ItemPresentationCoordinator, didChooseItems items: [Item]) - func itemPresentationCoordinator(_ coordinator: ItemPresentationCoordinator, shouldRemoveItems items: [Item], removeItemsHandler: (([Item]) -> Void)) + func itemPresentationCoordinator(_ coordinator: ItemPresentationCoordinator, shouldRemoveItems items: [Item], removeItemsHandler: @escaping (([Item]) -> Void)) } final class ItemPresentationCoordinator { @@ -70,6 +70,7 @@ final class ItemPresentationCoordinator { } extension ItemPresentationCoordinator: DirectoryItemPresentationCoordinatorDelegate { + func directoryItemPresentationCoordinator(_ coordinator: DirectoryItemPresentationCoordinator, didSelectItem item: Item) { start(item: item, fileSpecifications: fileSpecifications, configuration: configuration, animated: true) } @@ -88,7 +89,7 @@ extension ItemPresentationCoordinator: DirectoryItemPresentationCoordinatorDeleg func directoryItemPresentationCoordinatorDidFinish(_ coordinator: DirectoryItemPresentationCoordinator) { delegate?.itemPresentationCoordinatorDidFinish(self) } - internal func directoryItemPresentationCoordinator(_ coordinator: DirectoryItemPresentationCoordinator, shouldRemoveItems items: [Item], removeItemsHandler: (([Item]) -> Void)) { + internal func directoryItemPresentationCoordinator(_ coordinator: DirectoryItemPresentationCoordinator, shouldRemoveItems items: [Item], removeItemsHandler: @escaping (([Item]) -> Void)) { delegate?.itemPresentationCoordinator(self, shouldRemoveItems: items, removeItemsHandler: {(itemsToRemove) -> Void in removeItemsHandler(itemsToRemove) }) From a26e2f0dd7059aa036f3d474ae822cfc1f857cef Mon Sep 17 00:00:00 2001 From: Martin Labsch Date: Fri, 2 Jun 2017 18:16:35 +0200 Subject: [PATCH 09/13] changed version to 1.0.43 --- FileExplorer.podspec.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/FileExplorer.podspec.json b/FileExplorer.podspec.json index e0c2224..761d007 100644 --- a/FileExplorer.podspec.json +++ b/FileExplorer.podspec.json @@ -1,6 +1,6 @@ { "name": "FileExplorer", - "version": "1.0.41", + "version": "1.0.43", "summary": "FileExplorer is a powerful iOS file browser with the possiblity to choose and remove files and/or directories", "homepage": "https://github.com/Augustyniak/FileExplorer", "screenshots": "https://raw.github.com/Augustyniak/FileExplorer/master/Resources/Directories.gif", @@ -13,7 +13,7 @@ }, "source": { "git": "https://github.com/GitHubKsti/FileExplorer.git", - "tag": "v1.0.41" + "tag": "v1.0.43" }, "platforms": { "ios": "9.0" From 8266e56eed375ea4ce1aa64371572f0fba5bb7e9 Mon Sep 17 00:00:00 2001 From: Martin Labsch Date: Tue, 6 Jun 2017 11:35:51 +0200 Subject: [PATCH 10/13] trash button deactivation --- FileExplorer/FileExplorer/ActionsViewController.swift | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/FileExplorer/FileExplorer/ActionsViewController.swift b/FileExplorer/FileExplorer/ActionsViewController.swift index 2a06185..6e9d6c0 100644 --- a/FileExplorer/FileExplorer/ActionsViewController.swift +++ b/FileExplorer/FileExplorer/ActionsViewController.swift @@ -65,10 +65,12 @@ final class ActionsViewController: UIViewController { { toolbar.items?.insert(UIBarButtonItem(barButtonSystemItem: .action, target: self, action: #selector(handleShareButtonTap)), at: 0) } - if configuration.actionsConfiguration.canRemoveFiles - { - toolbar.items?.append(UIBarButtonItem(barButtonSystemItem: .trash, target: self, action: #selector(handleTrashButtonTap))) - } + // TODO: activate the following 'trash button' again and + // implement functionality to check if item can be deleted or not +// if configuration.actionsConfiguration.canRemoveFiles +// { +// toolbar.items?.append(UIBarButtonItem(barButtonSystemItem: .trash, target: self, action: #selector(handleTrashButtonTap))) +// } addContentChildViewController(contentViewController, insets: UIEdgeInsets(top: 0, left: 0, bottom: toolbar.bounds.height, right: 0)) navigationItem.title = contentViewController.navigationItem.title From 63f1d5b66d9dd2da8619e647d8cf19c1d0f96f1c Mon Sep 17 00:00:00 2001 From: Timo Steinwender Date: Sun, 11 Jun 2017 12:20:19 +0200 Subject: [PATCH 11/13] v1.0.44 file-extension with lowercased comparison --- FileExplorer.podspec.json | 4 ++-- FileExplorer/FileExplorer/Configuration.swift | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/FileExplorer.podspec.json b/FileExplorer.podspec.json index 761d007..9e1f3e5 100644 --- a/FileExplorer.podspec.json +++ b/FileExplorer.podspec.json @@ -1,6 +1,6 @@ { "name": "FileExplorer", - "version": "1.0.43", + "version": "1.0.44", "summary": "FileExplorer is a powerful iOS file browser with the possiblity to choose and remove files and/or directories", "homepage": "https://github.com/Augustyniak/FileExplorer", "screenshots": "https://raw.github.com/Augustyniak/FileExplorer/master/Resources/Directories.gif", @@ -13,7 +13,7 @@ }, "source": { "git": "https://github.com/GitHubKsti/FileExplorer.git", - "tag": "v1.0.43" + "tag": "v1.0.44" }, "platforms": { "ios": "9.0" diff --git a/FileExplorer/FileExplorer/Configuration.swift b/FileExplorer/FileExplorer/Configuration.swift index 5054fe6..028a257 100644 --- a/FileExplorer/FileExplorer/Configuration.swift +++ b/FileExplorer/FileExplorer/Configuration.swift @@ -66,7 +66,7 @@ public enum Filter { func matchesItem(withLastPathComponent lastPathComponent: String, type: ItemType, modificationDate: Date) -> Bool { switch self { case .`extension`(let `extension`): - return `extension` == (lastPathComponent as NSString).pathExtension + return `extension`.lowercased() == (lastPathComponent as NSString).pathExtension.lowercased() case .type(let t): return t == type case .lastPathComponent(let lastPathComp): From aa6e74f211bf3a706bc39ce4716d25cb51246cfc Mon Sep 17 00:00:00 2001 From: Timo Steinwender Date: Tue, 15 Aug 2017 14:42:36 +0200 Subject: [PATCH 12/13] added direct selection feature --- FileExplorer/FileExplorer/Configuration.swift | 1 + .../FileExplorer/DirectoryContentViewModel.swift | 9 +++++++-- .../FileExplorer/FileExplorerViewController.swift | 5 ++++- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/FileExplorer/FileExplorer/Configuration.swift b/FileExplorer/FileExplorer/Configuration.swift index 028a257..ccf1160 100644 --- a/FileExplorer/FileExplorer/Configuration.swift +++ b/FileExplorer/FileExplorer/Configuration.swift @@ -37,6 +37,7 @@ struct ActionsConfiguration { var canChooseFiles: Bool = false var canChooseDirectories: Bool = false var allowsMultipleSelection: Bool = false + var directSelection: Bool = false } struct FilteringConfiguration { diff --git a/FileExplorer/FileExplorer/DirectoryContentViewModel.swift b/FileExplorer/FileExplorer/DirectoryContentViewModel.swift index efed8fd..d7a8019 100644 --- a/FileExplorer/FileExplorer/DirectoryContentViewModel.swift +++ b/FileExplorer/FileExplorer/DirectoryContentViewModel.swift @@ -76,7 +76,7 @@ final class DirectoryContentViewModel { var isEditActionHidden: Bool { let actionsConfiguration = configuration.actionsConfiguration - return !actionsConfiguration.canChooseDirectories && !actionsConfiguration.canChooseFiles && !actionsConfiguration.canRemoveDirectories && !actionsConfiguration.canRemoveFiles + return !actionsConfiguration.canChooseDirectories && !actionsConfiguration.canChooseFiles && !actionsConfiguration.canRemoveDirectories && !actionsConfiguration.canRemoveFiles || (actionsConfiguration.directSelection) } var isEditActionEnabled: Bool { @@ -175,7 +175,12 @@ final class DirectoryContentViewModel { self.allItems = item.resource.filter { filteringConfiguration.fileFilters.count == 0 || filteringConfiguration.fileFilters.matchesItem($0) } self.allItems = self.allItems.filter { filteringConfiguration.ignoredFileFilters.count == 0 || !filteringConfiguration.ignoredFileFilters.matchesItem($0) } self.itemsToDisplay = DirectoryContentViewModel.itemsWithAppliedFilterAndSortCriterias(searchQuery: "", sortMode: sortMode, items: self.allItems) - + + //activate editing mode directly if direct selection with single selection has been set + if configuration.actionsConfiguration.directSelection + { + isEditing = true + } NotificationCenter.default.addObserver(self, selector: #selector(handleItemsDeletedNotification(_:)), name: Notification.Name.ItemsDeleted, object: nil) } diff --git a/FileExplorer/FileExplorer/FileExplorerViewController.swift b/FileExplorer/FileExplorer/FileExplorerViewController.swift index ebeac34..980352c 100644 --- a/FileExplorer/FileExplorer/FileExplorerViewController.swift +++ b/FileExplorer/FileExplorer/FileExplorerViewController.swift @@ -68,6 +68,8 @@ public final class FileExplorerViewController: UIViewController { /// A Boolean value indicating whether multiple files and/or directories can be choosen at a time. public var allowsMultipleSelection: Bool = true + /// if directSelection is enabled -> enable editing mode directly + public var directSelection: Bool = false /// Filters that determine which files are displayed by file explorer view controller. /// @@ -124,7 +126,8 @@ public final class FileExplorerViewController: UIViewController { canRemoveDirectories: canRemoveDirectories, canChooseFiles: canChooseFiles, canChooseDirectories: canChooseDirectories, - allowsMultipleSelection: allowsMultipleSelection) + allowsMultipleSelection: allowsMultipleSelection, + directSelection: directSelection) let filteringConfiguration = FilteringConfiguration(fileFilters: fileFilters, ignoredFileFilters: ignoredFileFilters) let configuration = Configuration(actionsConfiguration: actionsConfiguration, filteringConfiguration: filteringConfiguration) From f6b3f543cdb8db2022da3521ffe4e83496eb04ed Mon Sep 17 00:00:00 2001 From: Timo Steinwender Date: Wed, 17 Jul 2019 14:16:19 +0200 Subject: [PATCH 13/13] Swift 4 Migration V 1.1.0 --- FileExplorer.podspec.json | 4 +-- .../FileExplorer.xcodeproj/project.pbxproj | 34 +++++++++++++++---- .../xcschemes/FileExplorer.xcscheme | 2 +- .../FileExplorerTestHostApp.xcscheme | 8 ++--- .../DirectoryContentViewController.swift | 14 ++++---- .../DirectoryContentViewModel.swift | 2 +- .../DirectoryViewController.swift | 4 +-- .../FileExplorer/ErrorViewController.swift | 2 +- FileExplorer/FileExplorer/FileService.swift | 2 +- .../FileExplorer/FileViewController.swift | 16 ++++----- FileExplorer/FileExplorer/FileViewModel.swift | 2 +- FileExplorer/FileExplorer/ItemCell.swift | 20 +++++------ .../UICollectionView+Extension.swift | 10 +++--- .../FileExplorer/UITableView+Extension.swift | 2 +- .../UIViewController+Extension.swift | 8 ++--- FileExplorer/FileExplorer/URL+Extension.swift | 2 +- .../Pods/Pods.xcodeproj/project.pbxproj | 29 +++++++++++++++- .../xcschemes/Pods-FileExplorerTests.xcscheme | 2 +- 18 files changed, 106 insertions(+), 57 deletions(-) diff --git a/FileExplorer.podspec.json b/FileExplorer.podspec.json index 9e1f3e5..e84d3a1 100644 --- a/FileExplorer.podspec.json +++ b/FileExplorer.podspec.json @@ -1,6 +1,6 @@ { "name": "FileExplorer", - "version": "1.0.44", + "version": "1.1.0", "summary": "FileExplorer is a powerful iOS file browser with the possiblity to choose and remove files and/or directories", "homepage": "https://github.com/Augustyniak/FileExplorer", "screenshots": "https://raw.github.com/Augustyniak/FileExplorer/master/Resources/Directories.gif", @@ -13,7 +13,7 @@ }, "source": { "git": "https://github.com/GitHubKsti/FileExplorer.git", - "tag": "v1.0.44" + "tag": "v1.1.0" }, "platforms": { "ios": "9.0" diff --git a/FileExplorer/FileExplorer.xcodeproj/project.pbxproj b/FileExplorer/FileExplorer.xcodeproj/project.pbxproj index 7868b0e..698a6d4 100644 --- a/FileExplorer/FileExplorer.xcodeproj/project.pbxproj +++ b/FileExplorer/FileExplorer.xcodeproj/project.pbxproj @@ -426,7 +426,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0800; - LastUpgradeCheck = 0800; + LastUpgradeCheck = 1010; ORGANIZATIONNAME = "RafaƂ Augustyniak"; TargetAttributes = { 0634DDB31DBD28AD0053C454 = { @@ -436,7 +436,7 @@ }; 06A2082D1D85871A00E51C13 = { CreatedOnToolsVersion = 8.0; - LastSwiftMigration = 0800; + LastSwiftMigration = 1010; ProvisioningStyle = Automatic; }; 06CB0D4B1DBD32C7008321AD = { @@ -685,6 +685,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = 7DF52393DC5099B7570C90BD /* Pods-FileExplorerTests.debug.xcconfig */; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; DEVELOPMENT_TEAM = ""; INFOPLIST_FILE = FileExplorerTests/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; @@ -700,6 +701,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = B431DCC35D281FBEA3FDBBA3 /* Pods-FileExplorerTests.release.xcconfig */; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; DEVELOPMENT_TEAM = ""; INFOPLIST_FILE = FileExplorerTests/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; @@ -720,15 +722,24 @@ CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_SUSPICIOUS_MOVES = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -755,7 +766,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 10.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos10.1; + SDKROOT = iphoneos; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = ""; @@ -774,15 +785,24 @@ CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_SUSPICIOUS_MOVES = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -802,7 +822,7 @@ GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 10.0; MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos10.1; + SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; SWIFT_VERSION = ""; TARGETED_DEVICE_FAMILY = "1,2"; @@ -831,7 +851,8 @@ SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 3.0; + SWIFT_SWIFT3_OBJC_INFERENCE = On; + SWIFT_VERSION = 4.2; }; name = Debug; }; @@ -853,7 +874,8 @@ PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; SKIP_INSTALL = YES; - SWIFT_VERSION = 3.0; + SWIFT_SWIFT3_OBJC_INFERENCE = On; + SWIFT_VERSION = 4.2; }; name = Release; }; diff --git a/FileExplorer/FileExplorer.xcodeproj/xcshareddata/xcschemes/FileExplorer.xcscheme b/FileExplorer/FileExplorer.xcodeproj/xcshareddata/xcschemes/FileExplorer.xcscheme index 1ae4be0..18ae95c 100644 --- a/FileExplorer/FileExplorer.xcodeproj/xcshareddata/xcschemes/FileExplorer.xcscheme +++ b/FileExplorer/FileExplorer.xcodeproj/xcshareddata/xcschemes/FileExplorer.xcscheme @@ -1,6 +1,6 @@ + allowLocationSimulation = "YES"> UICollectionReusableView { - if kind == UICollectionElementKindSectionHeader { + if kind == UICollectionView.elementKindSectionHeader { let header = collectionView.dequeueReusableHeader(ofClass: CollectionViewHeader.self, for: indexPath) as CollectionViewHeader header.sortModeChangeAction = viewModel.sortModeChangeAction header.sortMode = viewModel.sortMode @@ -258,7 +258,7 @@ extension DirectoryContentViewController { header.layoutIfNeeded() } return header - } else if kind == UICollectionElementKindSectionFooter { + } else if kind == UICollectionView.elementKindSectionFooter { return collectionView.dequeueReusableFooter(ofClass: CollectionViewFooter.self, for: indexPath) as CollectionViewFooter } else { fatalError() diff --git a/FileExplorer/FileExplorer/DirectoryContentViewModel.swift b/FileExplorer/FileExplorer/DirectoryContentViewModel.swift index d7a8019..30d4457 100644 --- a/FileExplorer/FileExplorer/DirectoryContentViewModel.swift +++ b/FileExplorer/FileExplorer/DirectoryContentViewModel.swift @@ -214,7 +214,7 @@ final class DirectoryContentViewModel { } func deleteItems(at indexPaths: [IndexPath], completionBlock: @escaping (Result) -> Void) { - let items = indexPaths.flatMap { item(for: $0) } + let items = indexPaths.compactMap { item(for: $0) } fileService.delete(items: items) { result, removedItems, itemsNotRemovedDueToFailure in completionBlock(result) self.delegate?.directoryViewModelDidChange(self) diff --git a/FileExplorer/FileExplorer/DirectoryViewController.swift b/FileExplorer/FileExplorer/DirectoryViewController.swift index 7cfb8cc..02be0f6 100644 --- a/FileExplorer/FileExplorer/DirectoryViewController.swift +++ b/FileExplorer/FileExplorer/DirectoryViewController.swift @@ -105,7 +105,7 @@ final class DirectoryViewController: UIViewController { addContentChildViewController(directoryContentViewController, insets: UIEdgeInsets(top: searchController.searchBar.bounds.height, left: 0.0, bottom: 0.0, right: 0.0)) navigationItem.rightBarButtonItem = directoryContentViewController.navigationItem.rightBarButtonItem navigationItem.title = directoryContentViewController.navigationItem.title - view.sendSubview(toBack: directoryContentViewController.view) + view.sendSubviewToBack(directoryContentViewController.view) setUpLeftBarButtonItem() } @@ -135,7 +135,7 @@ final class DirectoryViewController: UIViewController { // MARK: Actions - func handleFinishButtonTap() { + @objc func handleFinishButtonTap() { delegate?.directoryViewControllerDidFinish(self) } } diff --git a/FileExplorer/FileExplorer/ErrorViewController.swift b/FileExplorer/FileExplorer/ErrorViewController.swift index d3d66ee..13b6434 100644 --- a/FileExplorer/FileExplorer/ErrorViewController.swift +++ b/FileExplorer/FileExplorer/ErrorViewController.swift @@ -64,7 +64,7 @@ final class ErrorViewController: UIViewController { // MARK: Actions - func handleFinishButtonTap() { + @objc func handleFinishButtonTap() { delegate?.errorViewControllerDidFinish(self) } } diff --git a/FileExplorer/FileExplorer/FileService.swift b/FileExplorer/FileExplorer/FileService.swift index 95b9d91..44be591 100644 --- a/FileExplorer/FileExplorer/FileService.swift +++ b/FileExplorer/FileExplorer/FileService.swift @@ -103,7 +103,7 @@ final class LocalStorageFileService: FileService { deletedItems, itemsNotRemovedDueToFailure) } else { - completionBlock(.success(), deletedItems, itemsNotRemovedDueToFailure) + completionBlock(.success(()), deletedItems, itemsNotRemovedDueToFailure) } } diff --git a/FileExplorer/FileExplorer/FileViewController.swift b/FileExplorer/FileExplorer/FileViewController.swift index 1e6d483..aafde43 100644 --- a/FileExplorer/FileExplorer/FileViewController.swift +++ b/FileExplorer/FileExplorer/FileViewController.swift @@ -44,21 +44,21 @@ final class FileViewController: UIViewController { let imageView = ImageView() imageView.translatesAutoresizingMaskIntoConstraints = false - imageView.setContentCompressionResistancePriority(UILayoutPriorityDefaultLow, for: .vertical) - imageView.setContentCompressionResistancePriority(UILayoutPriorityDefaultLow, for: .horizontal) + imageView.setContentCompressionResistancePriority(UILayoutPriority.defaultLow, for: .vertical) + imageView.setContentCompressionResistancePriority(UILayoutPriority.defaultLow, for: .horizontal) let titleView = TitleView() titleView.translatesAutoresizingMaskIntoConstraints = false titleView.title = viewModel.title - titleView.setContentCompressionResistancePriority(UILayoutPriorityRequired, for: .vertical) - titleView.setContentCompressionResistancePriority(UILayoutPriorityRequired, for: .horizontal) + titleView.setContentCompressionResistancePriority(UILayoutPriority.required, for: .vertical) + titleView.setContentCompressionResistancePriority(UILayoutPriority.required, for: .horizontal) let attributesView = AttributesView() attributesView.translatesAutoresizingMaskIntoConstraints = false attributesView.numberOfAttributes = viewModel.numberOfAttributes - attributesView.setContentCompressionResistancePriority(UILayoutPriorityRequired, for: .vertical) - attributesView.setContentCompressionResistancePriority(UILayoutPriorityRequired, for: .horizontal) + attributesView.setContentCompressionResistancePriority(UILayoutPriority.required, for: .vertical) + attributesView.setContentCompressionResistancePriority(UILayoutPriority.required, for: .horizontal) for (index, label) in attributesView.attributeNamesColumn.labels.enumerated() { let attributeViewModel = viewModel.attribute(for: index) label.text = attributeViewModel.attributeName @@ -150,7 +150,7 @@ final class TitleView: UIView { titleLabel.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true titleLabel.centerYAnchor.constraint(equalTo: centerYAnchor, constant: -1.0).isActive = true titleLabel.widthAnchor.constraint(equalTo: widthAnchor, constant: -20.0).isActive = true - titleLabel.setContentHuggingPriority(UILayoutPriorityRequired, for: .vertical) + titleLabel.setContentHuggingPriority(UILayoutPriority.required, for: .vertical) titleLabel.numberOfLines = 1 titleLabel.lineBreakMode = .byTruncatingTail @@ -185,7 +185,7 @@ final class TitleView: UIView { } override var intrinsicContentSize: CGSize { - return CGSize(width: UIViewNoIntrinsicMetric, height: 42.0) + return CGSize(width: UIView.noIntrinsicMetric, height: 42.0) } } diff --git a/FileExplorer/FileExplorer/FileViewModel.swift b/FileExplorer/FileExplorer/FileViewModel.swift index 423f63a..878557e 100644 --- a/FileExplorer/FileExplorer/FileViewModel.swift +++ b/FileExplorer/FileExplorer/FileViewModel.swift @@ -47,7 +47,7 @@ final class FileViewModel { FileViewModel.makeFileSizeItem(fromAttributes: self.item.attributes), FileViewModel.makeCreationDateItem(fromAttributes: self.item.attributes), FileViewModel.makeModificationDateItem(fromAttributes: self.item.attributes) - ].flatMap { $0 } + ].compactMap { $0 } } func thumbnailImage(with size: CGSize) -> UIImage { diff --git a/FileExplorer/FileExplorer/ItemCell.swift b/FileExplorer/FileExplorer/ItemCell.swift index 42ce185..45b78e5 100644 --- a/FileExplorer/FileExplorer/ItemCell.swift +++ b/FileExplorer/FileExplorer/ItemCell.swift @@ -30,8 +30,8 @@ protocol Editable { } enum ColorPallete { - static let gray = UIColor(colorLiteralRed: 200/255.0, green: 199/255.0, blue: 204/255.0, alpha: 1.0) - static let blue = UIColor(colorLiteralRed: 21/255.0, green: 126/255.0, blue: 251/255, alpha: 1.0) + static let gray = UIColor.init(red: 200/255.0, green: 199/255.0, blue: 204/255.0, alpha: 1.0) + static let blue = UIColor.init(red: 21/255.0, green: 126/255.0, blue: 151/255.0, alpha: 1.0) } enum LayoutConstants { @@ -151,26 +151,26 @@ final class ItemCell: UICollectionViewCell, Editable { private func setupAccessoryImageViewConstraints() { accessoryImageView.trailingAnchor.constraint(equalTo: containerView.trailingAnchor, constant: -15).isActive = true accessoryImageView.centerYAnchor.constraint(equalTo: containerView.centerYAnchor).isActive = true - accessoryImageView.setContentCompressionResistancePriority(UILayoutPriorityRequired, for: .horizontal) - accessoryImageView.setContentCompressionResistancePriority(UILayoutPriorityDefaultHigh, for: .vertical) - accessoryImageView.setContentHuggingPriority(UILayoutPriorityDefaultHigh, for: .horizontal) + accessoryImageView.setContentCompressionResistancePriority(UILayoutPriority.required, for: .horizontal) + accessoryImageView.setContentCompressionResistancePriority(UILayoutPriority.defaultHigh, for: .vertical) + accessoryImageView.setContentHuggingPriority(UILayoutPriority.defaultHigh, for: .horizontal) } private func setupTitleLabelContstraints() { titleTextLabel.leadingAnchor.constraint(equalTo: iconImageView.trailingAnchor, constant: 12.0).isActive = true titleTextLabel.trailingAnchor.constraint(equalTo: accessoryImageView.leadingAnchor, constant: -10.0).isActive = true titleTextLabel.topAnchor.constraint(equalTo: containerView.topAnchor, constant: 12.0).isActive = true - titleTextLabel.setContentCompressionResistancePriority(UILayoutPriorityDefaultHigh, for: .horizontal) - titleTextLabel.setContentHuggingPriority(UILayoutPriorityDefaultHigh, for: .vertical) + titleTextLabel.setContentCompressionResistancePriority(UILayoutPriority.defaultHigh, for: .horizontal) + titleTextLabel.setContentHuggingPriority(UILayoutPriority.defaultHigh, for: .vertical) } private func setupSubtitleLabelConstraints() { subtitleTextLabel.leadingAnchor.constraint(equalTo: titleTextLabel.leadingAnchor).isActive = true subtitleTextLabel.trailingAnchor.constraint(equalTo: titleTextLabel.trailingAnchor).isActive = true subtitleTextLabel.topAnchor.constraint(equalTo: titleTextLabel.bottomAnchor, constant: 3.0).isActive = true - subtitleTextLabel.setContentCompressionResistancePriority(UILayoutPriorityDefaultHigh + subtitleTextLabel.setContentCompressionResistancePriority(UILayoutPriority.defaultHigh , for: .horizontal) - subtitleTextLabel.setContentHuggingPriority(UILayoutPriorityDefaultHigh, for: .vertical) + subtitleTextLabel.setContentHuggingPriority(UILayoutPriority.defaultHigh, for: .vertical) } private func setupCheckmarkButtonConstraints() { @@ -260,7 +260,7 @@ final class ItemCell: UICollectionViewCell, Editable { // MARK: Actions - func handleAccessoryImageTap() { + @objc func handleAccessoryImageTap() { tapAction() } } diff --git a/FileExplorer/FileExplorer/UICollectionView+Extension.swift b/FileExplorer/FileExplorer/UICollectionView+Extension.swift index fe1b876..e0cbfc9 100644 --- a/FileExplorer/FileExplorer/UICollectionView+Extension.swift +++ b/FileExplorer/FileExplorer/UICollectionView+Extension.swift @@ -42,23 +42,23 @@ extension UICollectionView { } func registerFooter(ofClass viewClass: AnyClass) { - register(viewClass, forSupplementaryViewOfKind: UICollectionElementKindSectionFooter, withReuseIdentifier: String(describing: viewClass)) + register(viewClass, forSupplementaryViewOfKind: UICollectionView.elementKindSectionFooter, withReuseIdentifier: String(describing: viewClass)) } func dequeueReusableFooter(ofClass cellClass: AnyClass, for indexPath: IndexPath) -> T { - return dequeueReusableSupplementaryView(ofKind: UICollectionElementKindSectionFooter, withReuseIdentifier: String(describing: cellClass), for: indexPath) as! T + return dequeueReusableSupplementaryView(ofKind: UICollectionView.elementKindSectionFooter, withReuseIdentifier: String(describing: cellClass), for: indexPath) as! T } func registerHeader(ofClass viewClass: AnyClass) { - register(viewClass, forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withReuseIdentifier: String(describing: viewClass)) + register(viewClass, forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: String(describing: viewClass)) } func dequeueReusableHeader(ofClass cellClass: AnyClass, for indexPath: IndexPath) -> T { - return dequeueReusableSupplementaryView(ofKind: UICollectionElementKindSectionHeader, withReuseIdentifier: String(describing: cellClass), for: indexPath) as! T + return dequeueReusableSupplementaryView(ofKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: String(describing: cellClass), for: indexPath) as! T } func header(for indexPath: IndexPath) -> T? { - return supplementaryView(forElementKind: UICollectionElementKindSectionHeader, at: indexPath) as? T + return supplementaryView(forElementKind: UICollectionView.elementKindSectionHeader, at: indexPath) as? T } } diff --git a/FileExplorer/FileExplorer/UITableView+Extension.swift b/FileExplorer/FileExplorer/UITableView+Extension.swift index dbd3e16..d6655ba 100644 --- a/FileExplorer/FileExplorer/UITableView+Extension.swift +++ b/FileExplorer/FileExplorer/UITableView+Extension.swift @@ -38,7 +38,7 @@ extension UITableView { return cell } - func makeCell(with style: UITableViewCellStyle) -> UITableViewCell { + func makeCell(with style: UITableViewCell.CellStyle) -> UITableViewCell { return UITableViewCell(style: style, reuseIdentifier: String(describing: UITableViewCell.self)) } } diff --git a/FileExplorer/FileExplorer/UIViewController+Extension.swift b/FileExplorer/FileExplorer/UIViewController+Extension.swift index 3eb4f1f..b643957 100644 --- a/FileExplorer/FileExplorer/UIViewController+Extension.swift +++ b/FileExplorer/FileExplorer/UIViewController+Extension.swift @@ -39,7 +39,7 @@ extension UIViewController { func showLoadingIndicator() { guard self.activityIndicatorView == nil else { return } - let activityIndicatorView = UIActivityIndicatorView(activityIndicatorStyle: .whiteLarge) + let activityIndicatorView = UIActivityIndicatorView(style: .whiteLarge) activityIndicatorView.color = .gray activityIndicatorView.hidesWhenStopped = true activityIndicatorView.center = CGPoint(x: view.bounds.midX, y: view.bounds.midY) @@ -96,9 +96,9 @@ extension UIViewController { extension UIViewController { func addContentChildViewController(_ content: UIViewController, insets: UIEdgeInsets = UIEdgeInsets.zero) { view.addSubview(content.view) - addChildViewController(content) - content.view.frame = UIEdgeInsetsInsetRect(view.bounds, insets) + addChild(content) + content.view.frame = view.bounds.inset(by: insets) content.view.autoresizingMask = [.flexibleHeight, .flexibleWidth] - content.didMove(toParentViewController: self) + content.didMove(toParent: self) } } diff --git a/FileExplorer/FileExplorer/URL+Extension.swift b/FileExplorer/FileExplorer/URL+Extension.swift index cf66ab4..aed6d9d 100644 --- a/FileExplorer/FileExplorer/URL+Extension.swift +++ b/FileExplorer/FileExplorer/URL+Extension.swift @@ -43,6 +43,6 @@ extension URL { } func makeStandarizedFirstCharacterOfLastPathComponent() -> Character? { - return makeStandarizedLastPathComponent().localizedUppercase.characters.first + return makeStandarizedLastPathComponent().localizedUppercase.first } } diff --git a/FileExplorer/Pods/Pods.xcodeproj/project.pbxproj b/FileExplorer/Pods/Pods.xcodeproj/project.pbxproj index 7dea3ed..8ae007f 100644 --- a/FileExplorer/Pods/Pods.xcodeproj/project.pbxproj +++ b/FileExplorer/Pods/Pods.xcodeproj/project.pbxproj @@ -369,7 +369,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0730; - LastUpgradeCheck = 0700; + LastUpgradeCheck = 1010; }; buildConfigurationList = 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */; compatibilityVersion = "Xcode 3.2"; @@ -444,20 +444,32 @@ CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGNING_REQUIRED = NO; COPY_PHASE_STRIP = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "POD_CONFIGURATION_DEBUG=1", @@ -519,6 +531,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = 288824B537CA00FFBE130853E0AFDE17 /* Pods-FileExplorerTests.release.xcconfig */; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; @@ -591,6 +604,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = 103C19DFDFB60CB84A61B57E0EDB51AE /* Pods-FileExplorerTests.debug.xcconfig */; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; @@ -698,19 +712,31 @@ CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGNING_REQUIRED = NO; COPY_PHASE_STRIP = YES; ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; GCC_PREPROCESSOR_DEFINITIONS = ( "POD_CONFIGURATION_RELEASE=1", "$(inherited)", @@ -724,6 +750,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 10.0; PROVISIONING_PROFILE_SPECIFIER = NO_SIGNING/; STRIP_INSTALLED_PRODUCT = NO; + SWIFT_COMPILATION_MODE = wholemodule; SYMROOT = "${SRCROOT}/../build"; VALIDATE_PRODUCT = YES; }; diff --git a/FileExplorer/Pods/Pods.xcodeproj/xcshareddata/xcschemes/Pods-FileExplorerTests.xcscheme b/FileExplorer/Pods/Pods.xcodeproj/xcshareddata/xcschemes/Pods-FileExplorerTests.xcscheme index 9c784f4..b37b2b4 100644 --- a/FileExplorer/Pods/Pods.xcodeproj/xcshareddata/xcschemes/Pods-FileExplorerTests.xcscheme +++ b/FileExplorer/Pods/Pods.xcodeproj/xcshareddata/xcschemes/Pods-FileExplorerTests.xcscheme @@ -1,6 +1,6 @@