make.width.equalToSuperview()
make.top.equalTo(recordView.snp.bottom)
make.left.equalToSuperview()
-// make.height.equalTo(60)
+ make.height.equalTo(60)
}
}
}
func setupViews() {
-// backgroundColor = .red
+// backgroundColor = .yellow
addSubviews([leftItem,rightItem])
leftItem.do { (v) in
--- /dev/null
+//
+// RecordSearchBar.swift
+// ShenYin
+//
+// Created by liangshi on 2025/11/12.
+//
+
+@objc protocol RecordSearchBarDelegate {
+ func searchBarTextDidChange(_ toolBar:RecordSearchBar,_ text:String)
+}
+
+class RecordSearchBar:BaseView{
+ let bgView = UIView()
+ let textField = UITextField()
+ let icon = UIImageView(image: UIImage(named: "search_2"), )
+ let cancelBtn = UIButton(type: .custom)
+
+ weak var delegate:RecordSearchBarDelegate?
+ override init(frame: CGRect) {
+ super.init(frame: frame)
+ }
+
+ override func setupViews() {
+ backgroundColor = .color(.bgColor)
+
+ cancelBtn.do { v in
+ v.setTitle("取消".l10n, for: .normal)
+ v.setTitleColor(.rgb(0x666666), for: .normal)
+ v.titleLabel?.font = .regular(14)
+ v.addTarget(self, action: #selector(cancelAction), for: .touchUpInside)
+// v.backgroundColor = .yellow
+ }
+
+
+ bgView.do { v in
+ v.yc.setCornerRadius(8)
+ v.backgroundColor = .white
+ }
+
+ textField.do { v in
+ v.clearButtonMode = .whileEditing
+ v.backgroundColor = .clear
+ v.placeholder = "搜索".l10n
+ v.returnKeyType = .done
+ v.delegate = self
+ v.addTarget(self, action: #selector(textFieldDidChange(_:)), for: .editingChanged)
+ }
+
+ addSubviews([bgView,cancelBtn])
+ bgView.addSubview(icon)
+ bgView.addSubview(textField)
+ }
+ override func setupLayout() {
+ cancelBtn.snp.makeConstraints { make in
+ make.right.equalToSuperview()
+ make.bottom.equalToSuperview().inset(5)
+ make.height.equalTo(34)
+ make.width.equalTo(57)
+ }
+ bgView.snp.makeConstraints { make in
+ make.right.equalTo(cancelBtn.snp.left)
+ make.left.equalToSuperview().inset(18)
+ make.bottom.equalToSuperview().inset(5)
+ make.height.equalTo(34)
+ }
+ icon.snp.makeConstraints { make in
+ make.size.equalTo(18)
+ make.centerY.equalToSuperview()
+ make.left.equalToSuperview().inset(12)
+ }
+ textField.snp.makeConstraints { make in
+ make.left.equalToSuperview().inset(34)
+ make.top.bottom.equalToSuperview()
+ make.right.equalToSuperview()
+ }
+ }
+
+
+ required init?(coder: NSCoder) {
+ fatalError("init(coder:) has not been implemented")
+ }
+
+ @objc func textFieldDidChange(_ textField:UITextField){
+ delegate?.searchBarTextDidChange(self, textField.text ?? "")
+ }
+ @objc func cancelAction(){
+ App.shared.popPage(animated: true)
+ }
+
+}
+extension RecordSearchBar:UITextFieldDelegate{
+ func textFieldShouldReturn(_ textField: UITextField) -> Bool {
+ textField.resignFirstResponder()
+ return false
+ }
+}
override func setupViews() {
navBar.do { v in
v.title = "历史记录".l10n
-// let items = [NavigationRightItem(image: UIImage(named: "filter"),target: self, action: #selector(filterAction)),NavigationRightItem(image: UIImage(named: "search"), target: self,action: #selector(searchAction))]
- let items = [NavigationRightItem(image: UIImage(named: "filter"),target: self, action: #selector(filterAction))]
+ let items = [NavigationRightItem(image: UIImage(named: "filter"),target: self, action: #selector(filterAction)),NavigationRightItem(image: UIImage(named: "search"), target: self,action: #selector(searchAction))]
+// let items = [NavigationRightItem(image: UIImage(named: "filter"),target: self, action: #selector(filterAction))]
v.setupRightViews(items)
}
tableView.reloadData()
}
@objc func searchAction(){
-
+ let vc = HistorySearchVC()
+ vc.deleteCallback = { [weak self] deleteList in
+ guard let self = self else{return}
+ for item in deleteList{
+ list.removeAll(where: {$0.createTime == item.createTime})
+ }
+ tableView.reloadData()
+ }
+ App.shared.goToPage(vc)
}
@objc func filterAction(){
let list = FiltterRecordType.alls.map({$0.title})
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let data = list[indexPath.row]
- App.shared.goToPage(RecordDetailVC(record: data,needFrontVC:true))
+ let vc = RecordDetailVC(record: data,needFrontVC:true)
+ vc.delegateCallback = {[weak self] in
+ guard let self = self else { return }
+ list.removeAll(where: {$0.createTime == data.createTime})
+ tableView.reloadData()
+ }
+ App.shared.goToPage(vc)
}
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
// Created by liangshi on 2025/11/10.
//
+import UIKit
+class HistorySearchVC: BaseVC{
+ let searchBar = RecordSearchBar()
+ let tableView = UITableView(frame: .zero, style: .plain)
+ var orginList = [RecordDetailModel]()
+ var searchList = [RecordDetailModel]()
+ var deleteCallback:((_ list:[RecordDetailModel])->Void)?
+// init(data:[RecordDetailModel]) {
+// list = data
+// super.init()
+// }
+
+ override func viewDidLoad() {
+ super.viewDidLoad()
+ // Do any additional setup after loading the view.
+ }
+ override func viewWillAppear(_ animated: Bool) {
+ super.viewWillAppear(animated)
+ tableView.reloadData()
+ }
+ override func setupViews() {
+ navBar.addSubview(searchBar)
+ view.addSubviews([tableView])
+
+ searchBar.do { v in
+ v.delegate = self
+ }
+
+
+ tableView.do { v in
+ v.backgroundColor = .rgb(0xF7F7F7)
+ v.delegate = self
+ v.dataSource = self
+ v.estimatedRowHeight = 84
+ v.separatorStyle = .none
+ // v.isEditing = true
+ v.register(HistoryRecordCell.self, forCellReuseIdentifier: HistoryRecordCell.reuseID)
+ }
+
+ }
+ override func setupLayout() {
+ searchBar.snp.makeConstraints { make in
+ make.edges.equalToSuperview()
+ }
+ tableView.snp.makeConstraints { make in
+ make.left.right.equalToSuperview()
+ make.top.equalTo(kNavBtm)
+ make.bottom.equalToSuperview()
+ }
+ }
+ override func setupData() {
+ var cacheList = RecordCache.shared.getList()
+ cacheList = cacheList.sorted(by: {$0.createTime > $1.createTime})
+ orginList = cacheList
+ searchList = orginList
+ tableView.reloadData()
+ }
+ @objc func searchAction(){
+
+ }
+}
+
+extension HistorySearchVC:UITableViewDelegate,UITableViewDataSource {
+ func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
+ return searchList.count
+ }
+
+ func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
+ let cell = HistoryRecordCell.cell(withTableView: tableView, indexPath: indexPath)
+ cell.localModel = searchList[indexPath.row]
+ return cell
+ }
+ func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
+ let model = searchList[indexPath.row]
+ let vc = RecordDetailVC(record: model,needFrontVC:true)
+ vc.delegateCallback = {[weak self] in
+ guard let self = self else { return }
+ deleteCallback?([model])
+// RecordCache.shared.remove(model)
+ searchList.remove(at: indexPath.row)
+ orginList.removeAll(where: {$0 === model})
+ tableView.reloadData()
+ }
+ App.shared.goToPage(vc)
+ }
+ func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
+ if editingStyle == .delete {
+ CustomAlert.showWith(title: "您要删除这条录音吗?".l10n, messgage: "删除后,这些记录将无法恢复。".l10n, cancelCallback: {}) {[weak self] in
+ guard let self = self else{return}
+ let model = searchList[indexPath.row]
+ deleteCallback?([model])
+ RecordCache.shared.remove(model)
+ searchList.remove(at: indexPath.row)
+ orginList.removeAll(where: {$0 === model})
+ tableView.deleteRows(at: [indexPath], with:.fade)
+ }
+
+ }
+ }
+ func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
+ return true
+ }
+ func tableView(_ tableView: UITableView, titleForDeleteConfirmationButtonForRowAt indexPath: IndexPath) -> String? {
+ return "删除".l10n
+ }
+
+}
+extension HistorySearchVC:RecordSearchBarDelegate{
+ func searchBarTextDidChange(_ toolBar: RecordSearchBar, _ text: String) {
+ if text.isEmpty {
+ searchList = orginList
+ }
+ else{
+ var list = [RecordDetailModel]()
+ for item in orginList {
+ if item.name.uppercased() .contains(text.uppercased()) {
+ list.append(item)
+ }
+ }
+ searchList = list
+ }
+ tableView.reloadData()
+ }
+
+
+}
var remoteData:RecordHistoryModel?
var needFrontVC = false
var delegateCallback:(()->Void)?
+ var isDelete = false
init(record model: RecordDetailModel,needFrontVC:Bool = false) {
self.data = model
// }
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
+ if isDelete {
+ return
+ }
if remoteData == nil,let localData = data {
RecordCache.shared.add(localData)
}
extension RecordDetailVC:RecordDetailBarDelegate{
func recordDetailBarTranstlateAction(_ bar: RecordDetailBar) {
var list = AiSupportLanguage.translate.map{$0.title}
- list = list.filter { $0 != data!.from.title }
+// list = list.filter { $0 != data!.from.title }
let v = CustomPicker(title: "请选择语言".l10n, list:list )
v.selectedIndex = list.firstIndex(where: {data!.to.title == $0})!
+ v.disableTitle = data!.from.title
v.show()
v.didSelected = {[weak self] (index,value) in
guard let self = self else { return }
guard let self = self else {
return
}
- CustomAlert.showWith(title: "您要删除这条录音吗?".l10n, messgage: "删除后,此记录将无法恢复".l10n, cancelCallback: {}) {
+ CustomAlert.showWith(title: "您要删除这条录音吗?".l10n, messgage: "删除后,此记录将无法恢复".l10n, cancelCallback: {}) { [weak self] in
+ guard let self = self else{return}
if let data = self.remoteData{
let api = CommomApi.deleteVoiceRecord(recordId: data.id)
HttpClient.request(api) {(model:ResponseBaseModel,res) in
}
}
else{
+ if let model = data{
+ RecordCache.shared.remove(model)
+ }
+ isDelete = true
self.delegateCallback?()
App.shared.popPage()
}
v.backgroundColor = .clear
v.delegate = self
v.recordBtn.activeView.backgroundColor = .hexString("#F7F7F7")
- toolBar.rightItem.valueLabel.text = "手机".l10n
+ toolBar.leftItem.valueLabel.text = "手机".l10n
}
view.backgroundColor = .hexString("#F7F7F7")
private let btn = UIButton(type: .custom)
private let tableView = UITableView(frame: .zero, style: .plain)
var list:[String] = []
+ var disableTitle:String = ""{
+ didSet{
+ tableView.reloadData()
+ }
+ }
var selectedIndex = 0{
didSet{
tableView.reloadData()
let cell = CustomButton.SelectCell.cell(withTableView: tableView, indexPath: indexPath)
cell.titleLabel.text = list[indexPath.row]
cell.selectedIcon.isHidden = selectedIndex != indexPath.row
+ cell.enable = list[indexPath.row] != disableTitle
return cell
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
+ if list[indexPath.row] == disableTitle {
+ return
+ }
selectedIndex = indexPath.row
tableView.reloadData()
didSelected?(selectedIndex,list[selectedIndex])
}
}
-extension CustomButton {
+fileprivate extension CustomButton {
class SelectCell: BaseTableViewCell {
let bgView = UIView()
let titleLabel = UILabel()
}
}
-
+ var enable:Bool = true{
+ didSet{
+ if enable{
+ titleLabel.textColor = .rgb(0x121212)
+ }
+ else{
+ titleLabel.textColor = .rgb(0x999999)
+ }
+ }
+ }
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
}
let cell = LanguagePickerView.SelectCell.cell(withTableView: tableView, indexPath: indexPath)
cell.titleLabel.text = list[indexPath.row].title
cell.selectedIcon.isHidden = selectedIndex != indexPath.row
+ if segView.isRight && list[indexPath.row] == segView.leftLabel.language{
+ cell.enable = false
+ }
+ else if !segView.isRight && list[indexPath.row] == segView.rightLabel.language{
+ cell.enable = false
+ }
+ else{
+ cell.enable = true
+ }
+
return cell
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
+ if segView.isRight {
+ if list[indexPath.row] == segView.leftLabel.language {
+ return
+ }
+ }
+ else{
+ if list[indexPath.row] == segView.rightLabel.language {
+ return
+ }
+ }
+
selectedIndex = indexPath.row
tableView.reloadData()
didSelected?(segView.isRight ? 1:0 ,list[selectedIndex])
}
}
-extension LanguagePickerView {
+fileprivate extension LanguagePickerView {
class SelectCell: BaseTableViewCell {
let bgView = UIView()
let titleLabel = UILabel()
titleLabel.text = shareType.title
}
}
+ var enable:Bool = true{
+ didSet{
+ if enable{
+ titleLabel.textColor = .rgb(0x121212)
+ }
+ else{
+ titleLabel.textColor = .rgb(0x999999)
+ }
+ }
+ }
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {