关于ios:智汀云盘开发指南iOS端文件夹管理

34次阅读

共计 8060 个字符,预计需要花费 21 分钟才能阅读完成。

1. 文件夹列表: FolderManageViewController.swift

   /// 申请数据
    private func requestData() {
        if folders.count == 0 {showLoading()
        }
        
        let page = (folders.count / 30) + 1
        NetworkManager.shared.folderList(page: page, pageSize: 30) {[weak self] response in
            guard let self = self else {return}
            self.hideLoading()
            self.folders.append(contentsOf: response.list)
            self.collectionView.mj_header?.endRefreshing()
            self.collectionView.mj_footer?.endRefreshing()
            if !response.pager.has_more {self.collectionView.mj_footer?.endRefreshingWithNoMoreData()
            }
            self.collectionView.reloadData()} failureCallback: {[weak self] code, err in
            self?.collectionView.mj_header?.endRefreshing()
            self?.collectionView.mj_footer?.endRefreshing()
            self?.collectionView.reloadData()
            self?.hideLoading()
            self?.showToast(err)
        }
    }
    /// cell 配置
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {let cell = collectionView.dequeueReusableCell(withReuseIdentifier: FolderManageCell.reusableIdentifier, for: indexPath) as! FolderManageCell
        
        let folder = folders[indexPath.row]
        cell.folder = folder
        /// menu 按钮回调
        cell.menuCallback = {[weak self] in
            guard let self = self, let cell = self.collectionView.cellForItem(at: indexPath) else {return}
            let x = 35.ztScaleValue
            let y = 50.ztScaleValue + Screen.k_nav_height
            let alertPoint = cell.convert(CGPoint(x: x, y: y), to: self.view)
            let alert = MenuAlert(items: [.init(title: "更改明码", icon: .assets(.icon_lock))], alertPoint: alertPoint)
            alert.selectCallback = {[weak self] item in
                guard let self = self else {return}
                if item.title == "更改明码" {let alert = FolderEditPwdAlert()
                    alert.saveCallback = {[weak self] old, new, confrim in
                        guard let self = self else {return}
                        LoadingView.show()
                        NetworkManager.shared.editFolderPwd(id: folder.id, oldPwd: old, newPwd: new, confirmPwd: confrim) {[weak self] _ in
                            guard let self = self else {return}
                            alert.removeFromSuperview()
                            LoadingView.hide()
                            SceneDelegate.shared.window?.makeToast("批改胜利".localizedString)
                            self.reloadData()} failureCallback: { code, err in
                            LoadingView.hide()
                            SceneDelegate.shared.window?.makeToast(err)
                        }
                    }
                    SceneDelegate.shared.window?.addSubview(alert)
                }
            }
            SceneDelegate.shared.window?.addSubview(alert)
        }         
        /// 状态 cover 按钮回调
        cell.statusCoverCallback = {[weak self] index in
            guard let self = self else {return}
            switch folder.statusEnum {
            case .failToDelete:
                if index == 0 { // 批改文件夹失败 - 重试
                    self.showLoading()
                    NetworkManager.shared.restartAsyncTask(task_id: folder.task_id) {[weak self] _ in
                        guard let self = self else {return}
                        self.hideLoading()
                        self.reloadData()} failureCallback: {[weak self] code, err in
                        self?.hideLoading()
                        self?.showToast(err)
                    }
                }
            case .failToEdit:
                if index == 0 { // 批改文件夹失败 - 确定
                    self.showLoading()
                    NetworkManager.shared.deleteAsyncTask(task_id: folder.task_id) {[weak self] _ in
                        guard let self = self else {return}
                        self.hideLoading()
                        self.reloadData()} failureCallback: {[weak self] code, err in
                        self?.hideLoading()
                        self?.showToast(err)
                    }
                }
            default:
                break
            }
        }
        return cell
    }

2. 文件夹设置: FolderManageSettingViewController.swift

   /// 保留文件夹设置
    @objc
    private func tapSave() {guard let pool = selectedPool, let partition = selectedPartition else { return}

        showLoading()
        
        NetworkManager.shared.setFolderSettings(poolName: pool.name, partitionName: partition.name, autoDel: autoDeleteCell.switchBtn.isOn) {[weak self] _ in
            self?.hideLoading()
            SceneDelegate.shared.window?.makeToast("保留胜利".localizedString)
            self?.navigationController?.popViewController(animated: true)
        } failureCallback: {[weak self] code, err in
            self?.hideLoading()
            self?.showToast(err)
        }
    }
        /// 获取文件夹设置
    private func getFolderSettings() {showLoading(.custom(.white_ffffff))
        let sp = DispatchSemaphore(value: 1)
        DispatchQueue.global().async {sp.wait()
            /// 1 获取存储池列表
            NetworkManager.shared.storagePoolList(page: 0, pageSize: 0) {[weak self] response in
                guard let self = self else {return}
                self.storagePools = response.list
                sp.signal()} failureCallback: { _, _ in
                sp.signal()}
            sp.wait()
            NetworkManager.shared.getFolderSettings {[weak self] settings in
                sp.signal()
                guard let self = self else {return}
                self.hideLoading()
                self.autoDeleteCell.switchBtn.setIsOn(settings.is_auto_del) 
                self.storageDefaultCell.nameLabel.text = "\(settings.pool_name)-\(settings.partition_name)"
                self.selectedPool = self.storagePools.first(where: { $0.name == settings.pool_name})
                if let selectedPool = self.selectedPool {self.selectedPartition = selectedPool.lv.first(where: { $0.name == settings.partition_name})
                }
                
            } failureCallback: {[weak self] code, err in
                sp.signal()
                self?.hideLoading()
                self?.showToast(err)
            }
        }
    }

3. 创立、编辑、删除文件夹:EditFolderViewController.swift



 /// 删除文件夹
    @objc
    private func tapDelete() {let alert = TipsAlertView(title: "确定删除该文件夹吗?", detail: "删除后,该文件夹及其蕴含的所有文件夹 / 文件都全副删除。", warning: "操作不可撤销,请审慎操作!", sureBtnTitle: "确认删除")
        
        alert.sureCallback = {[weak self] in
            guard let self = self else {return}
            guard let id = self.type.folderId else {return}

            LoadingView.show()
            NetworkManager.shared.deleteFolder(id: id) {[weak self] _ in
                LoadingView.hide()
                self?.showToast("删除胜利".localizedString)
                alert.removeFromSuperview()
                self?.navigationController?.popViewController(animated: true)
            } failureCallback: {[weak self] code, err in
                LoadingView.hide()
                self?.showToast(err)
                alert.removeFromSuperview()}
        }
        SceneDelegate.shared.window?.addSubview(alert)
    }
    
    /// 保留批改
    @objc
    private func save() {
        if type == .create {
            let name = nameCell.textField.text ?? ""let pool_name = selectedPool?.name ??""
            let partition_name = selectedPartition?.name ?? ""
            let is_encrypt = isSecureCell.selectView.selectedIndex == 0 ? 1 : 0
            let pwd = pwdCell1.textField.text ?? ""let confirmPwd = pwdCell2.textField.text ??""
            var mode: FolderModel.FolderMode = .shared
            if folderTypeCell.selectView.selectedIndex == 0 {mode = .private}
            showLoading()
            NetworkManager.shared.createFolder(name: name, pool_name: pool_name, partition_name: partition_name, is_encrypt: is_encrypt, pwd: pwd, confirm_pwd: confirmPwd, mode: mode, auth: members) {[weak self] _ in
                self?.showToast("保留胜利".localizedString)
                self?.navigationController?.popViewController(animated: true)

            } failureCallback: {[weak self] code, err in
                self?.hideLoading()
                self?.showToast(err)
            }
        } else {guard let folder = folder else { return}
            let name = nameCell.textField.text ?? ""let pool_name = selectedPool?.name ??""
            let partition_name = selectedPartition?.name ?? ""
            var mode: FolderModel.FolderMode = .shared
            if folderTypeCell.selectView.selectedIndex == 0 {mode = .private}
            // 如果批改了分区
            if pool_name != folder.pool_name || partition_name != folder.partition_name {let tipsAlert = TipsAlertView(title: "存储分区转移".localizedString, titleColor: .custom(.black_3f4663), detail: "\(name) 存储分区从“\(folder.pool_name ??"")-\(folder.partition_name ?? "")”改为“\(pool_name)-\(partition_name)”", detailColor: .custom(.black_3f4663), warning: "批改预计须要一段时间解决,且中途不可勾销。确定要批改吗?".localizedString, warningColor: .custom(.red_fe0000), sureBtnTitle: "确定".localizedString)
                tipsAlert.sureCallback = {[weak self] in
                    guard let self = self else {return}
                    self.editFolder(id: folder.id, name: name, pool_name: pool_name, partition_name: partition_name, is_encrypt: folder.is_encrypt, mode: mode, auth: self.members)
                    tipsAlert.removeFromSuperview()}
                
                SceneDelegate.shared.window?.addSubview(tipsAlert)
                
            } else {editFolder(id: folder.id, name: name, pool_name: pool_name, partition_name: partition_name, is_encrypt: folder.is_encrypt, mode: mode, auth: members)
            }    
        }
    }
    
    /// 编辑文件夹
    private func editFolder(id: Int, name: String, pool_name: String, partition_name: String, is_encrypt: Int, mode: FolderModel.FolderMode, auth: [User]) {showLoading()
        NetworkManager.shared.editFolder(id: id, name: name, pool_name: pool_name, partition_name: partition_name, is_encrypt: is_encrypt, mode: mode, auth: auth) {[weak self] _ in
            guard let self = self else {return}
            if pool_name != self.folder?.pool_name || partition_name != self.folder?.partition_name {
                // 如果批改了分区
                let alert = SingleTipsAlertView(detail: "存储分区转移" + "\n\n" + "\(name) 存储分区正在从“\(self.folder?.pool_name ??"")-\(self.folder?.partition_name ?? "")”改为“\(pool_name)-\(partition_name)”, 已为您后盾运行, 可返回列表查看。", sureBtnTitle: "确定".localizedString)
                alert.sureCallback = {[weak self] in
                    guard let self = self else {return}
                    alert.removeFromSuperview()
                    self.showToast("保留胜利".localizedString)
                    self.navigationController?.popViewController(animated: true)
                }
                SceneDelegate.shared.window?.addSubview(alert)

            } else {self.showToast("保留胜利".localizedString)
                self.navigationController?.popViewController(animated: true)
            }
        } failureCallback: {[weak self] code, err in
            guard let self = self else {return}
            self.hideLoading()
            if code == 20019 {
                // 指标分区容量有余,不能迁徙
                let errAlert = SingleTipsAlertView(detail: "存储分区批改失败".localizedString + "\n\n" + "分区容量有余!".localizedString, sureBtnTitle: "确定".localizedString)
                errAlert.sureCallback = {errAlert.removeFromSuperview()
                }
                SceneDelegate.shared.window?.addSubview(errAlert)
                
            } else {self.showToast(err)
            } 
        }
    }

正文完
 0