iOS - Swift 。 MVC 到 MVVM 重构。使用 Delegate 方法处理 IBAction
iOS - Swift . MVC to MVVM refactor. Use Delegate method to handle IBActions
使用故事板构建UI。
Swift 5.
我的设置如下:
文件 1 - UI
@objc public protocol TestDelegateViewDelegate: class {
**func primaryAction()**
}
class TestDelegateView: UIView {
@IBOutlet private weak var button: UIButton!
weak var delegate: TestDelegateViewDelegate?
@IBAction private func primaryActionPressed(_ sender: UIButton) {
print("print if before delegate executes")
**delegate?.primaryAction()**
print("print if after delegate executes")
}
}
文件 2 - ViewController
extension TestDelegateViewController : TestDelegateViewDelegate {
**func primaryAction() {**
self.dismiss(animated: true, completion: nil)
print("print if delegate executes")
}
当我尝试这段代码时,我的代码确实打印了我所有的打印语句,
然而 - 我收到此错误:
Terminating app due to uncaught exception 'NSInvalidArgumentException',
reason: '-[Project.TestDelegateView buttonAction]:
unrecognized selector sent to instance 0x11bc0d2a0'
1 - 我使用委托有误吗?我需要在视图中保留 IBOutlets 和 IBActions。
2 - 是不是我使用 MVVM 有误?
3 - 此设计模式的最佳实践方法是什么?
4 - 为什么我会在这里收到此错误?它发生在所有代码运行之后。
非常感谢您的帮助。
某些东西——大概是故事板中的一个按钮——连接到一个名为 buttonAction
的函数。在您的代码中,IBAction
称为 primaryActionPressed
。
发生这种情况的通常方法是重命名代码函数,而不重置它们的故事板连接以匹配。
我找到了解决这个问题的方法——如何完整地实现 MVVM 设计模式。使用来自 UIView 的操作。然而,使用委托协议将大部分操作保留在视图控制器中。
协议
@objc public protocol TestDelegateViewDelegate: class {
**func primaryAction()**
}
UI视图文件
class TestDelegateView: UIView {
@IBOutlet private weak var button: UIButton!
weak var delegate: TestDelegateViewDelegate?
@IBAction private func primaryActionPressed(_ sender: UIButton) {
print("print if before delegate executes")
**delegate?.primaryAction()**
print("print if after delegate executes")
}
init(delegate: TestDelegateViewDelegate) {
self.delegate = delegate
}
}
视图控制器
class TestDelegateViewController: UIViewController {
var view: TestDelegateView?
viewDidLoad() {
view = TestDelegateView(delegate: self)
}
}
extension TestDelegateViewController : TestDelegateViewDelegate {
**func primaryAction() {**
self.dismiss(animated: true, completion: nil)
print("print if delegate executes")
}
使用故事板构建UI。
Swift 5.
我的设置如下:
文件 1 - UI
@objc public protocol TestDelegateViewDelegate: class {
**func primaryAction()**
}
class TestDelegateView: UIView {
@IBOutlet private weak var button: UIButton!
weak var delegate: TestDelegateViewDelegate?
@IBAction private func primaryActionPressed(_ sender: UIButton) {
print("print if before delegate executes")
**delegate?.primaryAction()**
print("print if after delegate executes")
}
}
文件 2 - ViewController
extension TestDelegateViewController : TestDelegateViewDelegate {
**func primaryAction() {**
self.dismiss(animated: true, completion: nil)
print("print if delegate executes")
}
当我尝试这段代码时,我的代码确实打印了我所有的打印语句, 然而 - 我收到此错误:
Terminating app due to uncaught exception 'NSInvalidArgumentException',
reason: '-[Project.TestDelegateView buttonAction]:
unrecognized selector sent to instance 0x11bc0d2a0'
1 - 我使用委托有误吗?我需要在视图中保留 IBOutlets 和 IBActions。
2 - 是不是我使用 MVVM 有误?
3 - 此设计模式的最佳实践方法是什么?
4 - 为什么我会在这里收到此错误?它发生在所有代码运行之后。
非常感谢您的帮助。
某些东西——大概是故事板中的一个按钮——连接到一个名为 buttonAction
的函数。在您的代码中,IBAction
称为 primaryActionPressed
。
发生这种情况的通常方法是重命名代码函数,而不重置它们的故事板连接以匹配。
我找到了解决这个问题的方法——如何完整地实现 MVVM 设计模式。使用来自 UIView 的操作。然而,使用委托协议将大部分操作保留在视图控制器中。
协议
@objc public protocol TestDelegateViewDelegate: class {
**func primaryAction()**
}
UI视图文件
class TestDelegateView: UIView {
@IBOutlet private weak var button: UIButton!
weak var delegate: TestDelegateViewDelegate?
@IBAction private func primaryActionPressed(_ sender: UIButton) {
print("print if before delegate executes")
**delegate?.primaryAction()**
print("print if after delegate executes")
}
init(delegate: TestDelegateViewDelegate) {
self.delegate = delegate
}
}
视图控制器
class TestDelegateViewController: UIViewController {
var view: TestDelegateView?
viewDidLoad() {
view = TestDelegateView(delegate: self)
}
}
extension TestDelegateViewController : TestDelegateViewDelegate {
**func primaryAction() {**
self.dismiss(animated: true, completion: nil)
print("print if delegate executes")
}