同声传译支持语言修改
authorliangzhenying <867174124@qq.com>
Thu, 13 Nov 2025 03:05:59 +0000 (11:05 +0800)
committerliangzhenying <867174124@qq.com>
Thu, 13 Nov 2025 03:05:59 +0000 (11:05 +0800)
ShenYin/ShenYin/UI/Home/Dialog/DialogRecordBar.swift
ShenYin/ShenYin/UI/Home/HistoryRecord/RecordSearchBar.swift [new file with mode: 0644]
ShenYin/ShenYin/UI/Home/HistoryRecord/VC/HistoryRecordVC.swift
ShenYin/ShenYin/UI/Home/HistoryRecord/VC/HistorySearchVC.swift
ShenYin/ShenYin/UI/Home/RecordDetail/RecordDetailVC.swift
ShenYin/ShenYin/UI/Home/RecordTranslateVC.swift
ShenYin/ShenYin/UI/common/pop/CustomPicker.swift
ShenYin/ShenYin/UI/common/pop/LanguagePicker/LanguagePickerView.swift

index 9246e6d..70204a0 100644 (file)
@@ -56,7 +56,7 @@ class DialogRecordBar: BaseView {
             make.width.equalToSuperview()
             make.top.equalTo(recordView.snp.bottom)
             make.left.equalToSuperview()
-//            make.height.equalTo(60)
+            make.height.equalTo(60)
         }
     }
     
@@ -257,7 +257,7 @@ class DialogRecordBar: BaseView {
         }
         
         func setupViews() {
-//            backgroundColor = .red
+//            backgroundColor = .yellow
             addSubviews([leftItem,rightItem])
 
             leftItem.do { (v) in
diff --git a/ShenYin/ShenYin/UI/Home/HistoryRecord/RecordSearchBar.swift b/ShenYin/ShenYin/UI/Home/HistoryRecord/RecordSearchBar.swift
new file mode 100644 (file)
index 0000000..b945972
--- /dev/null
@@ -0,0 +1,96 @@
+//
+//  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
+    }
+}
index 64ff1d3..4835d11 100644 (file)
@@ -24,8 +24,8 @@ class HistoryRecordVC: BaseVC{
     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)
         }
         
@@ -62,7 +62,15 @@ class HistoryRecordVC: BaseVC{
         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})
@@ -149,7 +157,13 @@ extension HistoryRecordVC:UITableViewDelegate,UITableViewDataSource {
     }
     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 {
index c452bd0..72f1d37 100644 (file)
@@ -5,3 +5,129 @@
 //  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()
+    }
+    
+    
+}
index 35aef70..badeb45 100644 (file)
@@ -22,6 +22,7 @@ class RecordDetailVC:BaseVC{
     var remoteData:RecordHistoryModel?
     var needFrontVC = false
     var delegateCallback:(()->Void)?
+    var isDelete = false
     
     init(record model: RecordDetailModel,needFrontVC:Bool = false) {
         self.data = model
@@ -60,6 +61,9 @@ class RecordDetailVC:BaseVC{
 //    }
     override func viewWillDisappear(_ animated: Bool) {
         super.viewWillDisappear(animated)
+        if isDelete {
+            return
+        }
         if remoteData == nil,let localData = data {
             RecordCache.shared.add(localData)
         }
@@ -301,10 +305,11 @@ extension RecordDetailVC:RecordDetailTopBarDelegate{
 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  }
@@ -368,7 +373,8 @@ extension RecordDetailVC:RecordDetailBarDelegate{
             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
@@ -377,6 +383,10 @@ extension RecordDetailVC:RecordDetailBarDelegate{
                     }
                 }
                 else{
+                    if let model = data{
+                        RecordCache.shared.remove(model)
+                    }
+                    isDelete = true
                     self.delegateCallback?()
                     App.shared.popPage()
                 }
index 60f0451..4490938 100644 (file)
@@ -28,7 +28,7 @@ class RecordTranslateVC:BaseVC{
             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")
         
index b08cef7..ef3150c 100644 (file)
@@ -11,6 +11,11 @@ class CustomPicker: BasePresentView {
     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()
@@ -89,9 +94,13 @@ extension CustomPicker:UITableViewDelegate,UITableViewDataSource {
         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])
@@ -99,7 +108,7 @@ extension CustomPicker:UITableViewDelegate,UITableViewDataSource {
     }
 }
 
-extension CustomButton {
+fileprivate extension CustomButton {
     class SelectCell: BaseTableViewCell {
         let bgView = UIView()
         let titleLabel = UILabel()
@@ -118,7 +127,16 @@ extension CustomButton {
             }
         }
         
-        
+        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)
         }
index 7e02c2e..b00fe06 100644 (file)
@@ -104,9 +104,30 @@ extension LanguagePickerView:UITableViewDelegate,UITableViewDataSource {
         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])
@@ -114,7 +135,7 @@ extension LanguagePickerView:UITableViewDelegate,UITableViewDataSource {
     }
 }
 
-extension LanguagePickerView {
+fileprivate extension LanguagePickerView {
     class SelectCell: BaseTableViewCell {
         let bgView = UIView()
         let titleLabel = UILabel()
@@ -132,6 +153,16 @@ extension LanguagePickerView {
                 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?) {