FileListViewController.swift
4.26 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
//
// FileListViewController.swift
// FileBrowser
//
// Created by Roy Marmelstein on 12/02/2016.
// Copyright © 2016 Roy Marmelstein. All rights reserved.
//
import UIKit
class FileListViewController: UIViewController {
// TableView
@IBOutlet weak var tableView: UITableView!
let collation = UILocalizedIndexedCollation.current()
/// Data
var didSelectFile: ((FBFile) -> ())?
var files = [FBFile]()
var initialPath: URL?
let parser = FileParser.sharedInstance
let previewManager = PreviewManager()
var sections: [[FBFile]] = []
var allowEditing: Bool = false
// Search controller
var filteredFiles = [FBFile]()
let searchController: UISearchController = {
let searchController = UISearchController(searchResultsController: nil)
searchController.searchBar.searchBarStyle = .minimal
searchController.searchBar.backgroundColor = UIColor.white
searchController.dimsBackgroundDuringPresentation = false
return searchController
}()
//MARK: Lifecycle
convenience init (initialPath: URL) {
self.init(initialPath: initialPath, showCancelButton: true)
}
convenience init (initialPath: URL, showCancelButton: Bool) {
self.init(nibName: "FileBrowser", bundle: Bundle(for: FileListViewController.self))
self.edgesForExtendedLayout = UIRectEdge()
// Set initial path
self.initialPath = initialPath
self.title = initialPath.lastPathComponent
// Set search controller delegates
searchController.searchResultsUpdater = self
searchController.searchBar.delegate = self
searchController.delegate = self
if showCancelButton {
// Add dismiss button
let dismissButton = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(FileListViewController.dismiss(button:)))
self.navigationItem.rightBarButtonItem = dismissButton
}
}
deinit{
if #available(iOS 9.0, *) {
searchController.loadViewIfNeeded()
} else {
searchController.loadView()
}
}
func prepareData() {
// Prepare data
if let initialPath = initialPath {
files = parser.filesForDirectory(initialPath)
indexFiles()
}
}
//MARK: UIViewController
override func viewDidLoad() {
prepareData()
// Set search bar
tableView.tableHeaderView = searchController.searchBar
// Register for 3D touch
self.registerFor3DTouch()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
// Scroll to hide search bar
self.tableView.contentOffset = CGPoint(x: 0, y: searchController.searchBar.frame.size.height)
// Make sure navigation bar is visible
self.navigationController?.isNavigationBarHidden = false
}
@objc func dismiss(button: UIBarButtonItem = UIBarButtonItem()) {
self.dismiss(animated: true, completion: nil)
}
//MARK: Data
func indexFiles() {
let selector: Selector = #selector(getter: FBFile.displayName)
sections = Array(repeating: [], count: collation.sectionTitles.count)
if let sortedObjects = collation.sortedArray(from: files, collationStringSelector: selector) as? [FBFile]{
for object in sortedObjects {
let sectionNumber = collation.section(for: object, collationStringSelector: selector)
sections[sectionNumber].append(object)
}
}
}
func fileForIndexPath(_ indexPath: IndexPath) -> FBFile {
var file: FBFile
if searchController.isActive {
file = filteredFiles[(indexPath as NSIndexPath).row]
}
else {
file = sections[(indexPath as NSIndexPath).section][(indexPath as NSIndexPath).row]
}
return file
}
func filterContentForSearchText(_ searchText: String) {
filteredFiles = files.filter({ (file: FBFile) -> Bool in
return file.displayName.lowercased().contains(searchText.lowercased())
})
tableView.reloadData()
}
}