Commit 7a599916 authored by lmj_521aiau@163.com's avatar lmj_521aiau@163.com

cloud

parent d6dbfaf5
......@@ -490,9 +490,6 @@
isa = PBXGroup;
children = (
A95CE03724E17BAF0066DAE6 /* SHTimer.swift */,
A94D935D24F7AF2300A886C0 /* SHLocationManager.swift */,
A94DD57124FDF9D200B1B5A2 /* SHMp3RecordManager.h */,
A94DD57224FDF9D200B1B5A2 /* SHMp3RecordManager.m */,
A94DD57B24FE377100B1B5A2 /* AlertControllerTool.h */,
A94DD57A24FE377100B1B5A2 /* AlertControllerTool.m */,
A9A16C782519DDC300DE0FEE /* PopView */,
......@@ -651,6 +648,9 @@
A95CDFED24E0F42E0066DAE6 /* Managers */ = {
isa = PBXGroup;
children = (
A94D935D24F7AF2300A886C0 /* SHLocationManager.swift */,
A94DD57124FDF9D200B1B5A2 /* SHMp3RecordManager.h */,
A94DD57224FDF9D200B1B5A2 /* SHMp3RecordManager.m */,
A94D935624F7958500A886C0 /* SHStoreManager.swift */,
A95CDFEE24E0F42E0066DAE6 /* SHUserAccountManager.swift */,
A95CDFF024E0F42F0066DAE6 /* CRContactTools.swift */,
......
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "完成@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "完成@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
......@@ -89,7 +89,7 @@ struct CRUserDefaults {
}
}
// recordList
//
static var sortType: NSInteger? {
set {
UserDefaults.standard.set(newValue, forKey: "com.app.sortType")
......
......@@ -29,13 +29,13 @@ class SHDeleteDetailsViewController: SHBaseViewController {
for (index, dic) in (list ?? []).enumerated(){
let model = SHRecordModel()
model.setValuesForKeys(dic)
if model.delete == true{
if model.deleteDate.daysBetweenDate(toDate: Date.init()) > 30 {
list?.remove(at: index)
}else{
dataSource.append(model)
}
}
// if model.delete == true{
// if model.deleteDate.daysBetweenDate(toDate: Date.init()) > 30 {
// list?.remove(at: index)
// }else{
// dataSource.append(model)
// }
// }
}
CRUserDefaults.recordList = list
}
......
......@@ -22,34 +22,4 @@ class SHRecordFolderModel: NSObject{
override func setValue(_ value: Any?, forUndefinedKey key: String) {
}
// //构造方法
// required init(createDate:Date=Date(), modifyDate:Date=Date(), name:String="", id:String="", top:Bool=false, dataSources:Array<SHRecordModel> = []) {
// self.name = name
// self.id = name
// self.createDate = createDate
// self.modifyDate = modifyDate
// self.top = top
// self.dataSources = dataSources
// }
//
// //从object解析回来
// required init(coder decoder: NSCoder) {
// self.createDate = (decoder.decodeObject(forKey: "createDate") as? Date)!
// self.modifyDate = (decoder.decodeObject(forKey: "modifyDate") as? Date)!
// self.id = decoder.decodeObject(forKey: "id") as? String ?? ""
// self.name = decoder.decodeObject(forKey: "name") as? String ?? ""
// self.top = decoder.decodeObject(forKey: "top") as? Bool ?? false
// self.dataSources = decoder.decodeObject(forKey: "dataSources") as! Array<SHRecordModel>
// }
//
// //编码成object
// func encode(with coder: NSCoder) {
// coder.encode(createDate, forKey:"createDate")
// coder.encode(modifyDate, forKey:"modifyDate")
// coder.encode(top, forKey:"top")
// coder.encode(name, forKey:"name")
// coder.encode(id, forKey:"id")
// coder.encode(dataSources, forKey:"dataSources")
// }
}
......@@ -10,75 +10,25 @@ import UIKit
class SHRecordModel: NSObject{
@objc var recordType: NSInteger = 0
@objc var createDate: Date = Date()
@objc var modifyDate: Date = Date()
@objc var deleteDate: Date = Date()
@objc var during: NSInteger = 0
@objc var address: String = ""
@objc var rename: String = ""
@objc var txt: String = ""
@objc var pathFile: String = ""
@objc var pcmPathFile: String = ""
@objc var txt: String = ""
@objc var during: NSInteger = 0
@objc var delete: Bool = false
@objc var top: Bool = false
@objc var selected: Bool = false
@objc var icloud: Bool = false
@objc var fileData: Data = Data()
override func setValue(_ value: Any?, forUndefinedKey key: String) {
}
// //构造方法
// required init(createDate:Date=Date(), modifyDate:Date=Date(), deleteDate:Date=Date(), during:NSInteger=0, address:String="", rename:String="", pathFile:String="", pcmPathFile:String="", txt:String="", delete:Bool=false, top:Bool=false, fileData:Data=Data()) {
// self.createDate = createDate
// self.modifyDate = modifyDate
// self.deleteDate = deleteDate
//
// self.during = during
// self.address = address
// self.pathFile = pathFile
// self.pcmPathFile = pcmPathFile
// self.txt = txt
//
// self.delete = delete
// self.top = top
//
// self.fileData = fileData
// self.rename = rename
// }
//
// //从object解析回来
// required init(coder decoder: NSCoder) {
// self.createDate = (decoder.decodeObject(forKey: "createDate") as? Date)!
// self.modifyDate = (decoder.decodeObject(forKey: "modifyDate") as? Date)!
// self.deleteDate = (decoder.decodeObject(forKey: "deleteDate") as? Date)!
// self.during = (decoder.decodeObject(forKey: "during") as? NSInteger)!
// self.address = decoder.decodeObject(forKey: "address") as? String ?? ""
// self.pathFile = decoder.decodeObject(forKey: "pathFile") as? String ?? ""
// self.pcmPathFile = decoder.decodeObject(forKey: "pcmPathFile") as? String ?? ""
// self.txt = decoder.decodeObject(forKey: "txt") as? String ?? ""
// self.delete = decoder.decodeObject(forKey: "delete") as? Bool ?? false
// self.top = decoder.decodeObject(forKey: "top") as? Bool ?? false
// self.fileData = (decoder.decodeObject(forKey: "fileData") as? Data)!
// self.rename = decoder.decodeObject(forKey: "rename") as? String ?? ""
// }
//
// //编码成object
// func encode(with coder: NSCoder) {
// coder.encode(createDate, forKey:"createDate")
// coder.encode(modifyDate, forKey:"modifyDate")
// coder.encode(deleteDate, forKey:"deleteDate")
// coder.encode(during, forKey:"during")
// coder.encode(address, forKey:"address")
// coder.encode(pathFile, forKey:"pathFile")
// coder.encode(pcmPathFile, forKey:"pcmPathFile")
// coder.encode(txt, forKey:"txt")
// coder.encode(delete, forKey:"delete")
// coder.encode(top, forKey:"top")
// coder.encode(fileData, forKey:"fileData")
// coder.encode(rename, forKey:"rename")
// }
}
......@@ -380,9 +380,6 @@
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="recordDetails_voice" translatesAutoresizingMaskIntoConstraints="NO" id="6je-jR-opG">
<rect key="frame" x="18" y="107" width="16" height="16"/>
</imageView>
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="recordDetails_icloud" translatesAutoresizingMaskIntoConstraints="NO" id="urE-AE-afS">
<rect key="frame" x="310" y="107" width="16" height="16"/>
</imageView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="XAw-V9-smq">
<rect key="frame" x="39" y="106.5" width="36" height="17"/>
<fontDescription key="fontDescription" type="system" pointSize="14"/>
......@@ -395,6 +392,15 @@
<color key="textColor" red="0.58431372549019611" green="0.62745098039215685" blue="0.72156862745098038" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="SzJ-Gk-Tag">
<rect key="frame" x="296" y="100" width="30" height="30"/>
<constraints>
<constraint firstAttribute="width" constant="30" id="oaj-sd-4Uh"/>
<constraint firstAttribute="height" constant="30" id="wkj-jD-iI1"/>
</constraints>
<state key="normal" image="recordDetails_icloud"/>
<state key="selected" image="recordDetails_icloud_selected"/>
</button>
</subviews>
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
<constraints>
......@@ -402,12 +408,12 @@
<constraint firstItem="6je-jR-opG" firstAttribute="leading" secondItem="6bV-3V-R81" secondAttribute="leading" id="3MN-xi-qGf"/>
<constraint firstItem="6je-jR-opG" firstAttribute="top" secondItem="FVv-OG-DwV" secondAttribute="bottom" constant="10" id="4KH-Iy-ZhP"/>
<constraint firstItem="XAw-V9-smq" firstAttribute="centerY" secondItem="6je-jR-opG" secondAttribute="centerY" id="50B-aE-1WZ"/>
<constraint firstAttribute="trailing" secondItem="urE-AE-afS" secondAttribute="trailing" constant="18" id="8HT-0k-imP"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="FVv-OG-DwV" secondAttribute="trailing" constant="17" id="8HX-P1-g1a"/>
<constraint firstItem="urE-AE-afS" firstAttribute="centerY" secondItem="6je-jR-opG" secondAttribute="centerY" id="Gn4-lu-046"/>
<constraint firstItem="6bV-3V-R81" firstAttribute="leading" secondItem="Ace-iU-keq" secondAttribute="leading" constant="18" id="IIf-qf-lrN"/>
<constraint firstItem="FVv-OG-DwV" firstAttribute="top" secondItem="cAa-wI-k0B" secondAttribute="bottom" constant="14" id="Lpt-nL-sQY"/>
<constraint firstAttribute="trailing" secondItem="SzJ-Gk-Tag" secondAttribute="trailing" constant="18" id="NMg-Q5-D9g"/>
<constraint firstItem="XAw-V9-smq" firstAttribute="leading" secondItem="6je-jR-opG" secondAttribute="trailing" constant="5" id="PC3-oS-13D"/>
<constraint firstItem="SzJ-Gk-Tag" firstAttribute="centerY" secondItem="XAw-V9-smq" secondAttribute="centerY" id="QtN-zj-NGy"/>
<constraint firstItem="cAa-wI-k0B" firstAttribute="leading" secondItem="6bV-3V-R81" secondAttribute="leading" id="RCB-kP-xS4"/>
<constraint firstItem="6bV-3V-R81" firstAttribute="top" secondItem="Ace-iU-keq" secondAttribute="top" constant="18" id="Sj5-yA-Hdn"/>
<constraint firstItem="FVv-OG-DwV" firstAttribute="leading" secondItem="6bV-3V-R81" secondAttribute="leading" id="k4e-UV-52H"/>
......@@ -436,6 +442,7 @@
<connections>
<outlet property="bgView" destination="Ace-iU-keq" id="31n-sq-R8Z"/>
<outlet property="duringLab" destination="XAw-V9-smq" id="VcG-2T-mDb"/>
<outlet property="icloudBtn" destination="SzJ-Gk-Tag" id="6yW-x7-QEA"/>
<outlet property="intervalConstraint" destination="Vl1-fz-hLo" id="7j9-uM-4A6"/>
<outlet property="leftConstraint" destination="ZZS-Bg-AaH" id="ddK-2Q-gnL"/>
<outlet property="selectedBtn" destination="adA-MF-vWU" id="4V6-5L-aw2"/>
......@@ -682,6 +689,7 @@
</scenes>
<resources>
<image name="recordDetails_icloud" width="16" height="16"/>
<image name="recordDetails_icloud_selected" width="16" height="16"/>
<image name="recordDetails_select" width="20" height="20"/>
<image name="recordDetails_selected" width="20" height="20"/>
<image name="recordDetails_voice" width="16" height="16"/>
......
......@@ -26,6 +26,7 @@ class SHRecordDetailsVC: SHBaseViewController {
override func viewDidLoad() {
super.viewDidLoad()
setupUI()
updateocloudUI()
}
override func viewWillAppear(_ animated: Bool) {
......@@ -85,6 +86,29 @@ class SHRecordDetailsVC: SHBaseViewController {
}
}
}
//MARK:XXXXXXXXX
func updateocloudUI(_ update: Bool = true){
for recordModel in self.currentModel.dataSources {
recordModel.icloud = false
}
for folderModel in SHCloudManager.shared.icloudFolderModels{
if self.currentModel.id == folderModel.id {
for recordModel in self.currentModel.dataSources {
for icloudRecordModel in folderModel.dataSources {
if recordModel.pathFile == icloudRecordModel.pathFile {
recordModel.icloud = icloudRecordModel.icloud
}
}
}
}
}
if update {
DispatchQueue.main.async {
self.tableView?.reloadData()
}
}
}
@objc func editClick(){
if currentModel.dataSources.count == 0 {
......@@ -104,6 +128,11 @@ class SHRecordDetailsVC: SHBaseViewController {
UIView.animate(withDuration: 0.25) {
self.bottomView?.frame = CGRect.init(x: -self.tableFooterView!.frame.width, y: 0, width: self.tableFooterView!.frame.width*2, height: self.tableFooterView!.frame.height)
}
for model in currentModel.dataSources{
model.selected = false
}
}
self.navigationItem.rightBarButtonItem?.tintColor = UIColor.init(hexStr: "4183F4")
self.tableView?.reloadData()
......@@ -144,7 +173,63 @@ extension SHRecordDetailsVC {
self.navigationController?.present(nav, animated: true, completion: nil)
move.saveSuccessCallBack = { model in
self.currentModel = model
self.tableView?.reloadData()
for model in self.currentModel.dataSources {
model.selected = false
}
self.edit = false
self.updateocloudUI()
// self.tableView?.reloadData()
}
}
//MARK:icloud上传Models
func icloundUpload(_ index:NSInteger){
let model = currentModel.dataSources[index]
var contains = false
for folderModel in SHCloudManager.shared.icloudFolderModels {
if currentModel.id == folderModel.id {
contains = true
break
}
}
if contains {
SHCloudManager.shared.addNewRecord(model) { (result, models) in
if result {
model.icloud = true
SHCloudManager.shared.modifyFolder(self.currentModel) { (result, models) in
if result {
self.updateocloudUI()
}
}
}
}
} else {
SHCloudManager.shared.addNewRecord(model) { (result, models) in
if result {
model.icloud = true
SHCloudManager.shared.addNewFolder(self.currentModel) { (result, models) in
if result {
self.updateocloudUI()
}
}
}
}
}
}
//MARK:icloud 移除 Models
func icloundRemove(_ index:NSInteger){
let model = currentModel.dataSources[index]
SHCloudManager.shared.deleteRecord(model) { (result, models) in
if result {
model.icloud = false
SHCloudManager.shared.modifyFolder(self.currentModel) { (result, models) in
if result {
self.updateocloudUI()
}
}
}
}
}
//MARK:删除Models
......@@ -162,7 +247,7 @@ extension SHRecordDetailsVC {
}
}
var list = CRUserDefaults.recordList
let list = CRUserDefaults.recordList
if var recordList = list{
for (index, subDict) in recordList.enumerated(){
let subFolderModel:SHRecordFolderModel = getDataDictWith(dict: subDict)
......@@ -177,21 +262,34 @@ extension SHRecordDetailsVC {
CRUserDefaults.recordList = recordList
}
list = keyValueStore.object(forKey: "Folderlist") as? [Dictionary<String, Any>]
if var recordList = list{
for (index, subDict) in recordList.enumerated(){
let subFolderModel:SHRecordFolderModel = getDataDictWith(dict: subDict)
if subFolderModel.id == currentModel.id {
subFolderModel.modifyDate = nowDate
subFolderModel.dataSources = currentModel.dataSources
let dic = getDictWith(obj: subFolderModel)
recordList[index] = dic
break
for model in selectRecordModels {
SHCloudManager.shared.deleteRecord(model) { (result, models) in
if result {
}
}
keyValueStore.set(recordList, forKey: "Folderlist")
keyValueStore.synchronize()
}
SHCloudManager.shared.modifyFolder(self.currentModel) { (result, models) in
if result {
self.updateocloudUI()
}
}
// list = keyValueStore.object(forKey: "Folderlist") as? [Dictionary<String, Any>]
// if var recordList = list{
// for (index, subDict) in recordList.enumerated(){
// let subFolderModel:SHRecordFolderModel = getDataDictWith(dict: subDict)
// if subFolderModel.id == currentModel.id {
// subFolderModel.modifyDate = nowDate
// subFolderModel.dataSources = currentModel.dataSources
// let dic = getDictWith(obj: subFolderModel)
// recordList[index] = dic
// break
// }
// }
// keyValueStore.set(recordList, forKey: "Folderlist")
// keyValueStore.synchronize()
// }
if currentModel.dataSources.count == 0 {
self.navigationItem.rightBarButtonItem = UIBarButtonItem.init(title: "编辑", style: .done, target: self, action: #selector(editClick))
......@@ -203,7 +301,7 @@ extension SHRecordDetailsVC {
bottomView?.cancel = true
}
selectRecordModels = []
edit = false
// edit = false
tableView?.reloadData()
}
//MARK:笔记弹框
......@@ -236,7 +334,8 @@ extension SHRecordDetailsVC {
record.saveSuccessCallBack = { model in
self.currentModel = model
self.tableView?.reloadData()
self.updateocloudUI()
// self.tableView?.reloadData()
}
break
}
......@@ -262,11 +361,19 @@ extension SHRecordDetailsVC: UITableViewDelegate, UITableViewDataSource{
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "SHRecordDetailsCell", for: indexPath) as! SHRecordDetailsCell
cell.model = currentModel.dataSources[indexPath.row]
let model = currentModel.dataSources[indexPath.row]
cell.model = model
cell.edit = edit
cell.selectCallBack = { selected in
self.selectModel(indexPath.row, selected: selected)
cell.selectCallBack = { (type, selected) in
if type == 0 {
self.selectModel(indexPath.row, selected: selected)
}else{
if model.icloud == false{
self.icloundUpload(indexPath.row)
}else{
self.icloundRemove(indexPath.row)
}
}
}
cell.selectionStyle = .none
......
......@@ -62,6 +62,13 @@ class SHRecordListViewController: SHBaseViewController {
NotificationCenter.default.addObserver(self, selector: #selector(hehe), name: NSUbiquitousKeyValueStore.didChangeExternallyNotification, object: keyValueStore)
let url = FileManager.default.url(forUbiquityContainerIdentifier: nil)
print(url as Any)
SHCloudManager.shared.getAllFolderDataSource { (result, sss) in
}
setupUI()
preposeMember()
MobClick.event("tab_imp")
......@@ -136,7 +143,7 @@ class SHRecordListViewController: SHBaseViewController {
if list == nil {
list = keyValueStore.object(forKey: "list") as? [Dictionary<String, Any>]
}
list = nil
if let list = list {
var folderModel = SHRecordFolderModel()
if let sub = list.first{
......@@ -166,18 +173,18 @@ class SHRecordListViewController: SHBaseViewController {
}
}
let modityList = keyValueStore.object(forKey: "Folderlist") as? [Dictionary<String, Any>]
if let list = modityList {
for dict in list.reversed(){
var model = SHRecordFolderModel()
model = getDataDictWith(dict: dict)
if model.top == true {
topDataSources.append(model)
}else{
dataSources.append(model)
}
}
}
// let modityList = keyValueStore.object(forKey: "Folderlist") as? [Dictionary<String, Any>]
// if let list = modityList {
// for dict in list.reversed(){
// var model = SHRecordFolderModel()
// model = getDataDictWith(dict: dict)
// if model.top == true {
// topDataSources.append(model)
// }else{
// dataSources.append(model)
// }
// }
// }
dataSources = dataSources.filterDuplicates({$0.id})
topDataSources = topDataSources.filterDuplicates({$0.id})
......@@ -294,18 +301,18 @@ extension SHRecordListViewController {
CRUserDefaults.recordList = list
}
let list = self.keyValueStore.object(forKey: "Folderlist") as? [Dictionary<String, Any>]
if var list = list {
for (index, dic) in list.enumerated(){
if dic["id"] as! String == deleteModel.id{
list.remove(at: index)
break
}
}
self.keyValueStore.set(list, forKey: "Folderlist")
self.keyValueStore.synchronize()
}
// let list = self.keyValueStore.object(forKey: "Folderlist") as? [Dictionary<String, Any>]
//
// if var list = list {
// for (index, dic) in list.enumerated(){
// if dic["id"] as! String == deleteModel.id{
// list.remove(at: index)
// break
// }
// }
// self.keyValueStore.set(list, forKey: "Folderlist")
// self.keyValueStore.synchronize()
// }
self.dataSources.remove(at: indexPath.row)
self.tableView?.beginUpdates()
......@@ -346,20 +353,20 @@ extension SHRecordListViewController {
CRUserDefaults.recordList = list
}
let list = self.keyValueStore.object(forKey: "Folderlist") as? [Dictionary<String, Any>]
if var list = list {
for (index, dic) in list.enumerated(){
if dic["id"] as! String == selectModel.id{
var subDic = dic
subDic["name"] = renameStr
list[index] = subDic
break
}
}
self.keyValueStore.set(list, forKey: "Folderlist")
self.keyValueStore.synchronize()
}
// let list = self.keyValueStore.object(forKey: "Folderlist") as? [Dictionary<String, Any>]
//
// if var list = list {
// for (index, dic) in list.enumerated(){
// if dic["id"] as! String == selectModel.id{
// var subDic = dic
// subDic["name"] = renameStr
// list[index] = subDic
// break
// }
// }
// self.keyValueStore.set(list, forKey: "Folderlist")
// self.keyValueStore.synchronize()
// }
DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(333)) {
self.prepareDateSource()
......@@ -385,20 +392,20 @@ extension SHRecordListViewController {
CRUserDefaults.recordList = list
}
let list = keyValueStore.object(forKey: "Folderlist") as? [Dictionary<String, Any>]
if var list = list {
for (index, dic) in list.enumerated(){
if dic["id"] as! String == deleteModel.id{
var subDic = dic
subDic["top"] = !deleteModel.top
list[index] = subDic
break
}
}
keyValueStore.set(list, forKey: "Folderlist")
keyValueStore.synchronize()
}
// let list = keyValueStore.object(forKey: "Folderlist") as? [Dictionary<String, Any>]
//
// if var list = list {
// for (index, dic) in list.enumerated(){
// if dic["id"] as! String == deleteModel.id{
// var subDic = dic
// subDic["top"] = !deleteModel.top
// list[index] = subDic
// break
// }
// }
// keyValueStore.set(list, forKey: "Folderlist")
// keyValueStore.synchronize()
// }
DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(333)) {
self.prepareDateSource()
......@@ -432,17 +439,17 @@ extension SHRecordListViewController {
CRUserDefaults.recordList = list
}
let list = self.keyValueStore.object(forKey: "Folderlist") as? [Dictionary<String, Any>]
if var list = list {
list.append(modelDict)
self.keyValueStore.set(list, forKey: "Folderlist")
self.keyValueStore.synchronize()
}else{
let list = [modelDict]
self.keyValueStore.set(list, forKey: "Folderlist")
self.keyValueStore.synchronize()
}
// let list = self.keyValueStore.object(forKey: "Folderlist") as? [Dictionary<String, Any>]
//
// if var list = list {
// list.append(modelDict)
// self.keyValueStore.set(list, forKey: "Folderlist")
// self.keyValueStore.synchronize()
// }else{
// let list = [modelDict]
// self.keyValueStore.set(list, forKey: "Folderlist")
// self.keyValueStore.synchronize()
// }
DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(333)) {
self.prepareDateSource()
......
......@@ -88,7 +88,8 @@ class SHRecordMoveFileVC: SHBaseViewController {
if list == nil {
list = keyValueStore.object(forKey: "list") as? [Dictionary<String, Any>]
}
list = nil
if list != nil {
for dict in list!.reversed(){
var model = SHRecordFolderModel()
......@@ -157,66 +158,32 @@ class SHRecordMoveFileVC: SHBaseViewController {
CRUserDefaults.recordList = list
}
let list = self.keyValueStore.object(forKey: "Folderlist") as? [Dictionary<String, Any>]
if var list = list {
list.append(modelDict)
self.keyValueStore.set(list, forKey: "Folderlist")
self.keyValueStore.synchronize()
}else{
let list = [modelDict]
self.keyValueStore.set(list, forKey: "Folderlist")
self.keyValueStore.synchronize()
}
// let list = self.keyValueStore.object(forKey: "Folderlist") as? [Dictionary<String, Any>]
//
// if var list = list {
// list.append(modelDict)
// self.keyValueStore.set(list, forKey: "Folderlist")
// self.keyValueStore.synchronize()
// }else{
// let list = [modelDict]
// self.keyValueStore.set(list, forKey: "Folderlist")
// self.keyValueStore.synchronize()
// }
DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(333)) {
self.prepareDataSource()
}
}
}
}
//MARK: tableView delegate
extension SHRecordMoveFileVC: UITableViewDelegate, UITableViewDataSource{
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if self.searchBarVC.isActive {
return searchDataSource.count
}
return dataSources.count
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 44
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let identifier = "UITableViewCell"
var cell = tableView.dequeueReusableCell(withIdentifier: identifier)
if cell == nil{
cell = UITableViewCell.init(style: .default, reuseIdentifier: identifier)
}
let model: SHRecordFolderModel
if self.searchBarVC.isActive {
model = searchDataSource[indexPath.row]
}else{
model = dataSources[indexPath.row]
}
cell?.textLabel?.text = model.name
cell?.selectionStyle = .none
return cell!
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
func moveFile(_ index:NSInteger) {
//TODO:转移
let targetModel: SHRecordFolderModel
var targetModel: SHRecordFolderModel
if self.searchBarVC.isActive {
targetModel = searchDataSource[indexPath.row]
targetModel = searchDataSource[index]
}else{
targetModel = dataSources[indexPath.row]
targetModel = dataSources[index]
}
let nowDate = Date()
for model in moveFiles {
......@@ -226,37 +193,7 @@ extension SHRecordMoveFileVC: UITableViewDelegate, UITableViewDataSource{
}
}
}
var list = CRUserDefaults.recordList
if var recordList = list{
//增
for (index, subDict) in recordList.enumerated(){
let subFolderModel:SHRecordFolderModel = getDataDictWith(dict: subDict)
if subFolderModel.id == targetModel.id {
subFolderModel.modifyDate = nowDate
subFolderModel.dataSources = subFolderModel.dataSources+moveFiles
let dic = getDictWith(obj: subFolderModel)
recordList[index] = dic
break
}
}
//删
if var recordList = list{
for (index, subDict) in recordList.enumerated(){
let subFolderModel:SHRecordFolderModel = getDataDictWith(dict: subDict)
if subFolderModel.id == currentModel.id {
subFolderModel.modifyDate = nowDate
subFolderModel.dataSources = currentModel.dataSources
let dic = getDictWith(obj: subFolderModel)
recordList[index] = dic
break
}
}
}
CRUserDefaults.recordList = recordList
}
list = keyValueStore.object(forKey: "Folderlist") as? [Dictionary<String, Any>]
let list = CRUserDefaults.recordList
if var recordList = list{
//增
for (index, subDict) in recordList.enumerated(){
......@@ -266,6 +203,8 @@ extension SHRecordMoveFileVC: UITableViewDelegate, UITableViewDataSource{
subFolderModel.dataSources = subFolderModel.dataSources+moveFiles
let dic = getDictWith(obj: subFolderModel)
recordList[index] = dic
targetModel = subFolderModel
break
}
}
......@@ -280,11 +219,105 @@ extension SHRecordMoveFileVC: UITableViewDelegate, UITableViewDataSource{
break
}
}
keyValueStore.set(recordList, forKey: "Folderlist")
keyValueStore.synchronize()
CRUserDefaults.recordList = recordList
}
SHCloudManager.shared.modifyFolder(self.currentModel) { (result, models) in
if result {
var contains = false
for folderModel in SHCloudManager.shared.icloudFolderModels {
if targetModel.id == folderModel.id {
contains = true
break
}
}
if contains {
SHCloudManager.shared.modifyFolder(targetModel) { (result, models) in
if result {
self.saveSuccessCallBack?(self.currentModel)
DispatchQueue.main.async {
self.navigationController?.dismiss(animated: true, completion: nil)
}
}
}
} else {
SHCloudManager.shared.addNewFolder(targetModel) { (result, models) in
if result {
self.saveSuccessCallBack?(self.currentModel)
DispatchQueue.main.async {
self.navigationController?.dismiss(animated: true, completion: nil)
}
}
}
}
}
}
// list = keyValueStore.object(forKey: "Folderlist") as? [Dictionary<String, Any>]
// if var recordList = list{
// //增
// for (index, subDict) in recordList.enumerated(){
// let subFolderModel:SHRecordFolderModel = getDataDictWith(dict: subDict)
// if subFolderModel.id == targetModel.id {
// subFolderModel.modifyDate = nowDate
// subFolderModel.dataSources = subFolderModel.dataSources+moveFiles
// let dic = getDictWith(obj: subFolderModel)
// recordList[index] = dic
// break
// }
// }
// //删
// for (index, subDict) in recordList.enumerated(){
// let subFolderModel:SHRecordFolderModel = getDataDictWith(dict: subDict)
// if subFolderModel.id == currentModel.id {
// subFolderModel.modifyDate = nowDate
// subFolderModel.dataSources = currentModel.dataSources
// let dic = getDictWith(obj: subFolderModel)
// recordList[index] = dic
// break
// }
// }
// keyValueStore.set(recordList, forKey: "Folderlist")
// keyValueStore.synchronize()
// }
}
}
//MARK: tableView delegate
extension SHRecordMoveFileVC: UITableViewDelegate, UITableViewDataSource{
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if self.searchBarVC.isActive {
return searchDataSource.count
}
return dataSources.count
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 44
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let identifier = "UITableViewCell"
var cell = tableView.dequeueReusableCell(withIdentifier: identifier)
if cell == nil{
cell = UITableViewCell.init(style: .default, reuseIdentifier: identifier)
}
let model: SHRecordFolderModel
if self.searchBarVC.isActive {
model = searchDataSource[indexPath.row]
}else{
model = dataSources[indexPath.row]
}
saveSuccessCallBack?(currentModel)
self.navigationController?.dismiss(animated: true, completion: nil)
cell?.textLabel?.text = model.name
cell?.selectionStyle = .none
return cell!
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
self.moveFile(indexPath.row)
}
}
......
......@@ -542,26 +542,26 @@ class SHRecordViewController: SHBaseViewController{
folderModel.dataSources.append(model)
}
let keyValueStore = NSUbiquitousKeyValueStore.default
let list = keyValueStore.object(forKey: "Folderlist") as? [Dictionary<String, Any>]
if var recordList = list{
for (index, subDict) in recordList.enumerated(){
let subFolderModel:SHRecordFolderModel = getDataDictWith(dict: subDict)
if subFolderModel.id == folderModel.id {
contains = true
subFolderModel.modifyDate = nowDate
subFolderModel.dataSources = folderModel.dataSources
let dic = getDictWith(obj: subFolderModel)
recordList[index] = dic
break
}
}
if contains == true {
keyValueStore.set(recordList, forKey: "Folderlist")
keyValueStore.synchronize()
}
}
// let keyValueStore = NSUbiquitousKeyValueStore.default
// let list = keyValueStore.object(forKey: "Folderlist") as? [Dictionary<String, Any>]
//
// if var recordList = list{
// for (index, subDict) in recordList.enumerated(){
// let subFolderModel:SHRecordFolderModel = getDataDictWith(dict: subDict)
// if subFolderModel.id == folderModel.id {
// contains = true
// subFolderModel.modifyDate = nowDate
// subFolderModel.dataSources = folderModel.dataSources
// let dic = getDictWith(obj: subFolderModel)
// recordList[index] = dic
// break
// }
// }
// if contains == true {
// keyValueStore.set(recordList, forKey: "Folderlist")
// keyValueStore.synchronize()
// }
// }
currentModel = model
} catch {
......
......@@ -14,13 +14,14 @@ class SHRecordDetailsCell: UITableViewCell {
@IBOutlet weak var intervalConstraint: NSLayoutConstraint?
@IBOutlet weak var bgView: UIView?
@IBOutlet weak var selectedBtn: UIButton?
@IBOutlet weak var icloudBtn: UIButton?
@IBOutlet weak var titleName: UILabel?
@IBOutlet weak var timeLab: UILabel?
@IBOutlet weak var txtLab: UILabel?
@IBOutlet weak var duringLab: UILabel?
var selectCallBack: ((Bool)->Void)?
var selectCallBack: ((NSInteger, Bool)->Void)?
private var _model: SHRecordModel?
var model: SHRecordModel {
......@@ -32,6 +33,7 @@ class SHRecordDetailsCell: UITableViewCell {
txtLab?.text = newValue.txt
duringLab?.text = countSecond(newValue.during)
selectedBtn?.isSelected = model.selected
icloudBtn?.isSelected = model.icloud
}
get{
return _model!
......@@ -69,11 +71,16 @@ class SHRecordDetailsCell: UITableViewCell {
bgView?.layer.borderColor = UIColor.init(hexStr: "EEEEEE").cgColor
selectedBtn?.addTarget(self, action: #selector(selectBtnClick(_:)), for: .touchUpInside)
icloudBtn?.addTarget(self, action: #selector(selectBtnClick(_:)), for: .touchUpInside)
}
@objc func selectBtnClick(_ sender:UIButton){
sender.isSelected = !sender.isSelected
selectCallBack?(sender.isSelected)
if sender == selectedBtn {
sender.isSelected = !sender.isSelected
selectCallBack?(0, sender.isSelected)
}else{
selectCallBack?(1, sender.isSelected)
}
}
@objc private func countSecond(_ during:NSInteger) -> String {
......
......@@ -16,15 +16,23 @@ class SHCloudManager: NSObject {
private override init() {}
let recordName = "Recording"
let recordFolderName = "recordFolder"
lazy var container = CKContainer.default()
lazy var dateBase = container.publicCloudDatabase
lazy var resultRecords:[CKRecord] = []
lazy var folderResults:[CKRecord] = []
lazy var recordResults:[CKRecord] = []
typealias handler = ((Bool) -> ())
var statusHandler: handler?
var icloudFolderModels:[SHRecordFolderModel] = []
func cheakAccountStatus(_ handler:@escaping handler){
typealias StatusHandler = ((Bool) -> ())
typealias CompletionHandler = ((Bool, [SHRecordFolderModel]) -> ())
var statusHandler: StatusHandler?
var completionHandler: CompletionHandler?
func cheakAccountStatus(_ handler:@escaping StatusHandler){
statusHandler = handler
......@@ -47,9 +55,29 @@ class SHCloudManager: NSObject {
}
}
func getAllRecordDataSource(){
func getAllFolderDataSource(_ handler:@escaping CompletionHandler){
completionHandler = handler
let predicate = NSPredicate.init(value: true)
let query = CKQuery.init(recordType: recordFolderName, predicate: predicate)
dateBase.perform(query, inZoneWith: nil) { (records, queryError) in
if let error = queryError {
print("\(error.localizedDescription)")
self.completionHandler?(false, [])
}else{
self.folderResults = records ?? []
self.getAllRecordDataSource(handler)
// self.cleanAllFolder()
}
}
}
func getAllRecordDataSource(_ handler:@escaping CompletionHandler){
let dateBase = container.publicCloudDatabase
completionHandler = handler
let predicate = NSPredicate.init(value: true)
let query = CKQuery.init(recordType: recordName, predicate: predicate)
......@@ -58,73 +86,297 @@ class SHCloudManager: NSObject {
if let error = queryError {
print("\(error.localizedDescription)")
self.completionHandler?(false, [])
}else{
self.resultRecords = records!
self.recordResults = records ?? []
self.mapDataSource()
self.completionHandler?(true, self.icloudFolderModels)
// self.cleanAllRecord()
}
}
}
func cleanAllRecord(){
for model in self.recordResults {
self.deleteRecord(model) { (result, models) in
}
}
}
func addNewRecord(_ model: SHRecordModel){
func cleanAllFolder(){
for model in self.folderResults {
self.deleteRecord(model) { (result, models) in
}
}
}
func mapDataSource(){
icloudFolderModels = []
for record in self.folderResults{
let folderModel = SHRecordFolderModel()
folderModel.createDate = record["createDate"] as? Date ?? Date(timeIntervalSince1970: 0)
folderModel.modifyDate = record["modifyDate"] as? Date ?? Date(timeIntervalSince1970: 0)
folderModel.top = record["top"] as? Bool ?? false
folderModel.id = record["id"] as? String ?? ""
folderModel.name = record["name"] as? String ?? ""
let recordPaths:[String] = record["recordPaths"] as! [String]
var contains = false
for pathFile in recordPaths{
for record in self.recordResults{
if pathFile == record["pathFile"] {
contains = true
let recordModel = SHRecordModel()
recordModel.recordType = record["recordType"] as? NSInteger ?? 0
recordModel.address = record["address"] as? String ?? ""
recordModel.pathFile = record["pathFile"] as? String ?? ""
recordModel.rename = record["title"] as? String ?? ""
recordModel.txt = record["content"] as? String ?? ""
recordModel.createDate = record["createDate"] as? Date ?? Date(timeIntervalSince1970: 0)
recordModel.modifyDate = record["modifyDate"] as? Date ?? Date(timeIntervalSince1970: 0)
recordModel.icloud = true
// let asset = record["recordAsset"] as! CKAsset
// print(asset.fileURL?.path)
folderModel.dataSources.append(recordModel)
}
}
}
if contains == false {
}
icloudFolderModels.append(folderModel)
}
}
func addNewFolder(_ model: SHRecordFolderModel, handler:@escaping CompletionHandler){
let documentsFile = (NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first)!.appending(model.pathFile)
let url = URL.init(fileURLWithPath: documentsFile)
let asset = CKAsset.init(fileURL: url)
completionHandler = handler
let dateBase = container.publicCloudDatabase
var recordPaths:[String] = []
for recordModel in model.dataSources{
let path = recordModel.pathFile
if recordModel.icloud {
recordPaths.append(path)
}
}
let newRecording = CKRecord.init(recordType: recordName)
newRecording.setValue(model.address, forKey: "title")
newRecording.setValue(model.address, forKey: "address")
newRecording.setValue(model.txt, forKey: "content")
newRecording.setValue(model.createDate, forKey: "createTime")
newRecording.setValue(0, forKey: "delete")
newRecording.setValue(asset, forKey: "recordAsset")
let folderRecord = CKRecord.init(recordType: recordFolderName)
folderRecord.setValue(model.name, forKey: "name")
folderRecord.setValue(model.id, forKey: "id")
folderRecord.setValue(model.createDate, forKey: "createTime")
folderRecord.setValue(model.modifyDate, forKey: "modifyDate")
folderRecord.setValue(model.top, forKey: "top")
folderRecord.setValue(recordPaths, forKey: "recordPaths")
dateBase.save(newRecording) { (subscription, saveError) in
dateBase.save(folderRecord) { (subscription, saveError) in
if let error = saveError {
print("\(error.localizedDescription)")
self.completionHandler?(false, [])
}else{
self.folderResults.append(folderRecord)
self.mapDataSource()
self.completionHandler?(true, self.icloudFolderModels)
}
}
}
func modifyRecord(){
let dateBase = container.publicCloudDatabase
func addNewRecord(_ recordModel: SHRecordModel, handler:@escaping CompletionHandler){
let record = resultRecords.first
dateBase.fetch(withRecordID: record!.recordID) { (record, fetchError) in
completionHandler = handler
let recording = self.recordResults.filter({ (item) -> Bool in
return item["pathFile"] == recordModel.pathFile
}).first
if recording == nil {
let documentsFile = (NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first)!.appending(recordModel.pathFile)
let url = URL.init(fileURLWithPath: documentsFile)
let asset = CKAsset.init(fileURL: url)
let record = CKRecord.init(recordType: recordName)
record.setValue(recordModel.recordType, forKey: "recordType")
record.setValue(recordModel.rename, forKey: "title")
record.setValue(recordModel.pathFile, forKey: "pathFile")
record.setValue(recordModel.address, forKey: "address")
record.setValue(recordModel.txt, forKey: "content")
record.setValue(recordModel.createDate, forKey: "createTime")
record.setValue(recordModel.modifyDate, forKey: "modifyDate")
record.setValue(asset, forKey: "recordAsset")
dateBase.save(record) { (subscription, saveError) in
if let error = saveError {
print("\(error.localizedDescription)")
self.completionHandler?(false, [])
}else{
self.recordResults.append(record)
self.mapDataSource()
self.completionHandler?(true, self.icloudFolderModels)
}
}
} else {
}
}
func modifyFolder(_ folderModel: SHRecordFolderModel, handler:@escaping CompletionHandler){
completionHandler = handler
var recordPaths:[String] = []
for recordModel in folderModel.dataSources{
let path = recordModel.pathFile
if recordModel.icloud == true {
recordPaths.append(path)
}
}
let folderRecord = self.folderResults.filter({ (item) -> Bool in
return item["id"] == folderModel.id
}).first
dateBase.fetch(withRecordID: folderRecord!.recordID) { (record, fetchError) in
if let error = fetchError {
print("\(error.localizedDescription)")
self.completionHandler?(false, [])
}else {
record![""] = ""
dateBase.save(record!) { (saveRecord, saveError) in
record?["recordPaths"] = recordPaths
record?["modifyDate"] = folderModel.modifyDate
self.dateBase.save(record!) { (saveRecord, saveError) in
if let error = saveError {
print("\(error.localizedDescription)")
self.completionHandler?(false, [])
}else{
if let index = self.folderResults.firstIndex(where: {
$0["id"] == folderModel.id
}){
self.folderResults[index] = saveRecord!
}
self.mapDataSource()
self.completionHandler?(true, self.icloudFolderModels)
}
}
}
}
}
func deleteRecord(){
func modifyRecord(_ recordModel: SHRecordModel, handler:@escaping CompletionHandler){
completionHandler = handler
let recording = self.recordResults.filter({ (item) -> Bool in
return item["pathFile"] == recordModel.pathFile
}).first
dateBase.fetch(withRecordID: recording!.recordID) { (record, fetchError) in
if let error = fetchError {
print("\(error.localizedDescription)")
self.completionHandler?(false, [])
}else {
record?.setValue(recordModel.modifyDate, forKey: "modifyDate")
self.dateBase.save(record!) { (saveRecord, saveError) in
if let error = saveError {
print("\(error.localizedDescription)")
self.completionHandler?(false, [])
}else{
if let index = self.recordResults.firstIndex(where: {
$0["pathFile"] == recordModel.pathFile
}){
self.recordResults[index] = saveRecord!
}
self.mapDataSource()
self.completionHandler?(true, self.icloudFolderModels)
}
}
}
}
}
func deleteFolder(_ folderModel: SHRecordFolderModel, handler:@escaping CompletionHandler){
completionHandler = handler
let dateBase = container.publicCloudDatabase
let folderRecord = self.folderResults.filter({ (item) -> Bool in
return item["id"] == folderModel.id
}).first
let record = resultRecords.first
if folderRecord == nil{
self.completionHandler?(false, [])
return
}
dateBase.delete(withRecordID: folderRecord!.recordID) { (recordID, deleteError) in
if let error = deleteError {
print("\(error.localizedDescription)")
self.completionHandler?(false, [])
}else{
if let index = self.folderResults.firstIndex(where: {
$0["id"] == folderModel.id
}){
self.folderResults.remove(at: index)
}
self.mapDataSource()
self.completionHandler?(true, self.icloudFolderModels)
}
}
}
func deleteRecord(_ recordModel: SHRecordModel, handler:@escaping CompletionHandler){
completionHandler = handler
let record = self.recordResults.filter({ (item) -> Bool in
return item["pathFile"] == recordModel.pathFile
}).first
if record == nil{
self.completionHandler?(false, [])
return
}
dateBase.delete(withRecordID: record!.recordID) { (recordID, deleteError) in
if let error = deleteError {
print("\(error.localizedDescription)")
self.completionHandler?(false, [])
}else{
if let index = self.recordResults.firstIndex(where: {
$0["pathFile"] == recordModel.pathFile
}){
self.recordResults.remove(at: index)
}
self.mapDataSource()
self.completionHandler?(true, self.icloudFolderModels)
}
}
}
func deleteRecord(_ record: CKRecord, handler:@escaping CompletionHandler){
completionHandler = handler
dateBase.delete(withRecordID: record.recordID) { (recordID, deleteError) in
if let error = deleteError {
print("\(error.localizedDescription)")
self.completionHandler?(false, [])
}else{
if let index = self.recordResults.firstIndex(where: {
$0.recordID == record.recordID
}){
self.recordResults.remove(at: index)
}
self.mapDataSource()
self.completionHandler?(true, self.icloudFolderModels)
}
}
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment