如何将 UITextFieldDelegate 移动到 ViewModel

问题描述 投票:0回答:1
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 并且没有触发。

我必须做什么?

swift mvvm uitextfield
1个回答
0
投票

首先,我不会推荐你这个,因为

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
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.