Delegates/Protocols UIView 和 UIViewController 之间不工作
Delegates/Protocols between UIView & UIViewController not working
我正在做一个项目,我试图在 UIView 和 UIViewController 之间 运行 一些 delegates/protocols。在这个项目中,我还有其他一些 delegates/protocols 到 运行,但有一个让我非常难过。
我已经搜索了 Google 和 SO,但还没有找到解决方案,所以我希望有人能在这里帮助我。
这是我的 UIView 的片段...
class SideMenuHomeView: UIView {
var expansionState: SideMenuExpansionState!
var mapController: MapController!
enum SideMenuExpansionState {
case NotExpanded
case Expanded
}
override init(frame: CGRect) {
super.init(frame: frame)
let mapController = MapController()
mapController.menuDelegate = self
expansionState = .NotExpanded
}
func handleSideMenuToggle() {
if expansionState == .NotExpanded {
animateInputView(targetPosition: self.frame.origin.x + 300) { (_) in
self.expansionState = .Expanded
}
}
}
extension SideMenuHomeView: SideMenuHomeDelegate {
func handleSideMenuHome() {
handleSideMenuToggle()
}
}
这是我的 UIViewController 的片段...
class MapController: UIViewController {
var menuDelegate: SideMenuHomeDelegate!
@objc func handleOpenMenu() {
menuDelegate?.handleSideMenuHome()
}
}
这是我的 Protocol.swift...
protocol SideMenuHomeDelegate {
func handleSideMenuHome()
}
将 SideMenuHomeView 添加到 MapController
func configureSideMenuHomeView() {
sideMenuHomeView = SideMenuHomeView()
view.addSubview(sideMenuHomeView)
sideMenuHomeView.anchorwithConstant(top: view.topAnchor, bottom: view.bottomAnchor, leading: view.leadingAnchor, trailing: nil, paddingTop: 0, paddingBottom: 0, paddingLeading: -(view.frame.width - 20), paddingTrailing: 0, width: view.frame.width, height: 0)
}
我想要实现的是当我点击 UIViewController 上的按钮时,UIView 在 X 轴上向右移动 300 像素。
当我将我的动画代码块连接到 UIView 上的按钮时,它起作用了,所以不是那样。我发现这是我的 delegate/protocol 代码,但无法弄清楚它有什么问题。
有人会碰巧知道我当前的代码有什么问题吗?在 UIView 和 UIViewController 之间是否有 suggested/better 通信方式?
谢谢!
如果您在添加 SideMenuHomeView
的同时设置 delegate
,您的问题将得到解决,如下所示,
func configureSideMenuHomeView() {
sideMenuHomeView = SideMenuHomeView()
view.addSubview(sideMenuHomeView)
self.menuDelegate = sideMenuHomeView
sideMenuHomeView.anchorwithConstant(top: view.topAnchor, bottom: view.bottomAnchor, leading: view.leadingAnchor, trailing: nil, paddingTop: 0, paddingBottom: 0, paddingLeading: -(view.frame.width - 20), paddingTrailing: 0, width: view.frame.width, height: 0)
}
但是你在这里使用了错误的委托。当您拥有 SideMenuHomeView
的 instance
时,您不需要显式地引用其 delegate
,因为您已经拥有 instance
上的所有方法。这就像对同一个对象的两个引用。
我正在做一个项目,我试图在 UIView 和 UIViewController 之间 运行 一些 delegates/protocols。在这个项目中,我还有其他一些 delegates/protocols 到 运行,但有一个让我非常难过。
我已经搜索了 Google 和 SO,但还没有找到解决方案,所以我希望有人能在这里帮助我。
这是我的 UIView 的片段...
class SideMenuHomeView: UIView {
var expansionState: SideMenuExpansionState!
var mapController: MapController!
enum SideMenuExpansionState {
case NotExpanded
case Expanded
}
override init(frame: CGRect) {
super.init(frame: frame)
let mapController = MapController()
mapController.menuDelegate = self
expansionState = .NotExpanded
}
func handleSideMenuToggle() {
if expansionState == .NotExpanded {
animateInputView(targetPosition: self.frame.origin.x + 300) { (_) in
self.expansionState = .Expanded
}
}
}
extension SideMenuHomeView: SideMenuHomeDelegate {
func handleSideMenuHome() {
handleSideMenuToggle()
}
}
这是我的 UIViewController 的片段...
class MapController: UIViewController {
var menuDelegate: SideMenuHomeDelegate!
@objc func handleOpenMenu() {
menuDelegate?.handleSideMenuHome()
}
}
这是我的 Protocol.swift...
protocol SideMenuHomeDelegate {
func handleSideMenuHome()
}
将 SideMenuHomeView 添加到 MapController
func configureSideMenuHomeView() {
sideMenuHomeView = SideMenuHomeView()
view.addSubview(sideMenuHomeView)
sideMenuHomeView.anchorwithConstant(top: view.topAnchor, bottom: view.bottomAnchor, leading: view.leadingAnchor, trailing: nil, paddingTop: 0, paddingBottom: 0, paddingLeading: -(view.frame.width - 20), paddingTrailing: 0, width: view.frame.width, height: 0)
}
我想要实现的是当我点击 UIViewController 上的按钮时,UIView 在 X 轴上向右移动 300 像素。
当我将我的动画代码块连接到 UIView 上的按钮时,它起作用了,所以不是那样。我发现这是我的 delegate/protocol 代码,但无法弄清楚它有什么问题。
有人会碰巧知道我当前的代码有什么问题吗?在 UIView 和 UIViewController 之间是否有 suggested/better 通信方式?
谢谢!
如果您在添加 SideMenuHomeView
的同时设置 delegate
,您的问题将得到解决,如下所示,
func configureSideMenuHomeView() {
sideMenuHomeView = SideMenuHomeView()
view.addSubview(sideMenuHomeView)
self.menuDelegate = sideMenuHomeView
sideMenuHomeView.anchorwithConstant(top: view.topAnchor, bottom: view.bottomAnchor, leading: view.leadingAnchor, trailing: nil, paddingTop: 0, paddingBottom: 0, paddingLeading: -(view.frame.width - 20), paddingTrailing: 0, width: view.frame.width, height: 0)
}
但是你在这里使用了错误的委托。当您拥有 SideMenuHomeView
的 instance
时,您不需要显式地引用其 delegate
,因为您已经拥有 instance
上的所有方法。这就像对同一个对象的两个引用。