extension ViewModel: TextFieldDelegate {
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
search()
textField.resignFirstResponder()
return true
}
}
protocol TextFieldDelegate: AnyObject {
func textFieldShouldReturn(_ textField: UITextField) -> Bool
}
我用这种方式创建了ViewModel
searchView.textField.delegate = viewModel
我也在 ViewDidLoad 中这样定义了它,但我得到了错误 无法将类型“ConsentListSelectionViewModel”的值分配给类型“(任何 UITextFieldDelegate)?”
Xcode 为我提供了这个解决方案
searchView.textField.delegate = viewModel as? any UITextFieldDelegate
当我这样运行它时,委托等于 nil 并且没有触发。
我必须做什么?
首先,我不会推荐你这个,因为
UITextFieldDelegate
应该留在视图层。相反,将 UITextFieldDelegate
方法的实现细节委托给您的视图模型。
但是如果你真的想这样做,你需要在视图中声明视图模型,以便视图确定视图模型实现了
UITextFieldDelegate
。例如:
import UIKit
class ViewModel: NSObject { }
extension ViewModel: UITextViewDelegate { }
class YourView {
let viewModel: ViewModel & UITextViewDelegate
init(viewModel: ViewModel & UITextViewDelegate) {
self.viewModel = viewModel
}
}
或者,基于协议的方法:
import UIKit
protocol ViewModel: UITextViewDelegate { }
class DefaultViewModel: NSObject, ViewModel { }
class YourView {
private let viewModel: ViewModel
init(viewModel: ViewModel) {
self.viewModel = viewModel
}
}