如何解决iOS-Swift从MVC到MVVM重构使用Delegate方法处理IBAction
使用情节提要构建UI。
迅速5。
我的设置如下:
@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和IBAction。
2-我使用MVVM可能是错误的吗?
3-这种设计模式的最佳做法是什么?
非常感谢您的帮助。
解决方法
某些东西(可能是情节提要中的一个按钮)已连接到名为buttonAction
的函数。在您的代码中,IBAction
被称为primaryActionPressed
。
这种情况的通常发生方式是重命名代码功能,而不重置其故事板连接以匹配。
,我找到了解决此问题的方法-如何完全实现MVVM设计模式。来自UIView的动作。但是,通过使用委托协议,大多数动作仍在View控制器中进行。
协议
select a.*
from mytable t1
where exists (
select 1
from mytable t1
where t1.al = t.al and t1.date = t.date and t1.id <> t.id
)
UIView文件
@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")
}
init(delegate: TestDelegateViewDelegate) {
self.delegate = delegate
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。