| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203 |
- //
- // FileViewController.swift
- // JChat
- //
- // Created by 邓永豪 on 2017/8/28.
- // Copyright © 2017年 HXHG. All rights reserved.
- //
- import UIKit
- enum FileType {
- case doc
- case music
- case video
- case other
- }
- class FileViewController: UIViewController {
-
- var isEditModel: Bool {
- get {
- return isEdit
- } set {
- isEdit = newValue
- selectMessages = []
- tableView.reloadData()
- }
- }
-
- var fileType = FileType.doc // default
- var messages: [JMSGMessage] = []
- var selectMessages: [JMSGMessage] = []
- override func viewDidLoad() {
- super.viewDidLoad()
- _init()
- }
-
- func reloadDate() {
- sortMessage()
- tableView.reloadData()
- }
-
- fileprivate var isEdit = false
- fileprivate var tableView: UITableView = UITableView(frame: .zero, style: .grouped)
- fileprivate lazy var data: Dictionary<String, [JMSGMessage]> = Dictionary()
- fileprivate lazy var keys: [String] = []
-
- fileprivate lazy var documentInteractionController = UIDocumentInteractionController()
-
- private func _init() {
- view.backgroundColor = UIColor(netHex: 0xe8edf3)
- tableView.backgroundColor = UIColor(netHex: 0xe8edf3)
- tableView.delegate = self
- tableView.dataSource = self
- tableView.separatorStyle = .none
- tableView.register(FileCell.self, forCellReuseIdentifier: "FileCell")
- view.addSubview(tableView)
- view.addConstraint(_JCLayoutConstraintMake(tableView, .left, .equal, view, .left))
- view.addConstraint(_JCLayoutConstraintMake(tableView, .top, .equal, view, .top))
- view.addConstraint(_JCLayoutConstraintMake(tableView, .right, .equal, view, .right))
- view.addConstraint(_JCLayoutConstraintMake(tableView, .bottom, .equal, view, .bottom))
- }
-
- func sortMessage() {
- keys.removeAll()
- data.removeAll()
- for message in messages {
- let formatter = DateFormatter()
- formatter.dateFormat = "yyyy-MM";
- let date = Date(timeIntervalSince1970: TimeInterval(message.timestamp.intValue / 1000))
- let key = formatter.string(from: date)
- var array = data[key]
- if array == nil {
- array = [message]
- } else {
- array?.append(message)
- }
- if !keys.contains(key) {
- keys.append(key)
- }
- data[key] = array
- }
- keys = keys.sorted(by: { (str1, str2) -> Bool in
- str1 > str2
- })
- }
- }
- //Mark: -
- extension FileViewController: UITableViewDelegate, UITableViewDataSource {
-
- func numberOfSections(in tableView: UITableView) -> Int {
- return keys.count
- }
-
- public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
- return data[keys[section]]!.count
- }
-
- func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
- return keys[section]
- }
-
- func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
- return 84
- }
-
- func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
- return 26
- }
-
- func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
- return 0.001
- }
-
- func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
- return tableView.dequeueReusableCell(withIdentifier: "FileCell", for: indexPath)
- }
-
- func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
- guard let cell = cell as? FileCell else {
- return
- }
- let message = data[keys[indexPath.section]]![indexPath.row]
- let content = message.content as! JMSGFileContent
- var image = UIImage()
- switch fileType {
- case .doc:
- image = UIImage.loadImage("com_icon_file_file")!
- case .music:
- image = UIImage.loadImage("com_icon_file_music")!
- case .video:
- image = UIImage.loadImage("com_icon_file_video")!
- default:
- image = UIImage.loadImage("com_icon_file_other")!
- }
- let file = File(image, content.fileName, message.ex.fileSize ?? "", "\(message.fromName) \(keys[indexPath.section])")
- cell.bindData(file)
- cell.isEditMode = isEdit
- if !isEditModel {
- cell.isSelectImage = false
- }
- }
-
- func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
- tableView.deselectRow(at: indexPath, animated: true)
- guard let cell = tableView.cellForRow(at: indexPath) as? FileCell else {
- return
- }
- let message = data[keys[indexPath.section]]![indexPath.row]
- if cell.isEditMode {
- if cell.isSelectImage {
- selectMessages = selectMessages.filter({ (m) -> Bool in
- message.msgId != m.msgId
- })
- } else {
- selectMessages.append(message)
- }
- cell.isSelectImage = !cell.isSelectImage
- NotificationCenter.default.post(name: NSNotification.Name(rawValue: "kDidSelectFileMessage"), object: nil)
- } else {
- let content = message.content as! JMSGFileContent
- let type = message.ex.fileType
- let fileName = content.fileName
- switch fileType {
- case .doc:
- content.fileData({ (data, msgId, error) in
- let vc = JCDocumentViewController()
- vc.title = fileName
- vc.fileData = data
- vc.filePath = content.originMediaLocalPath
- vc.fileType = type
- DispatchQueue.main.async {
- self.navigationController?.pushViewController(vc, animated: true)
- }
- })
-
- case .video, .music:
- let url = URL(fileURLWithPath: content.originMediaLocalPath ?? "")
- try! JCVideoManager.playVideo(data: Data(contentsOf: url), type ?? "", currentViewController: self)
- default:
- let url = URL(fileURLWithPath: content.originMediaLocalPath ?? "")
- documentInteractionController.url = url
- documentInteractionController.presentOptionsMenu(from: .zero, in: self.view, animated: true)
- }
- }
- }
- }
- extension FileViewController: UIDocumentInteractionControllerDelegate {
- func documentInteractionControllerViewControllerForPreview(_ controller: UIDocumentInteractionController) -> UIViewController {
- return self
- }
- func documentInteractionControllerViewForPreview(_ controller: UIDocumentInteractionController) -> UIView? {
- return view
- }
- func documentInteractionControllerRectForPreview(_ controller: UIDocumentInteractionController) -> CGRect {
- return view.frame
- }
- }
|