此代码位于OverlayView.swift
中protocol OverlayViewControllerDelegate {
func didCancel(overlayView: OverlayView)
func didShoot(overlayView: OverlayView)
}
class OverlayView: UIView {
@IBOutlet weak var cameraLabel: UILabel!
var delegate: OverlayViewControllerDelegate! = nil
@IBAction func cancel(_ sender: AnyObject) {
cameraLabel.text = "I want to exit"
delegate.didCancel(overlayView: self)
}
我想要做的就是点击取消按钮的任何时候。是使当前页面转换为视图控制器的页面。我想从第一页到第二页。
答案 0 :(得分:3)
它应该是OverlayViewDelegate
而不是OverlayViewControllerDelegate
,因为它不是您发送活动的控制器,对吗?从OverlayView
的角度来看,实际执行此协议的人员并不重要,但发送活动的人更重要。
你可能在某个地方有一个视图控制器,这将是implement
这个协议:
class ViewController: UIViewController, OverlayViewDelegate {
//another code
func didCancel(overlayView: OverlayView) {
//show a new controller
}
}
推送到导航堆栈:
let newViewController = AnotherViewController()
self.navigationController?.pushViewController(vc, animated: true) //your current vc should be already in a UINavigationController
目前的模态示例:
let newViewController = AnotherViewController()
self.present(newViewController, animated: true, completion: nil)
perform
从这样的代码中删除:
performSegue(withIdentifier: "segueIdentifier", sender: nil)
performSegue(withIdentifier: "segueIdentifier", sender: someUsefulData)
segue本身可以推送或以模态方式呈现,只需在创建时选择正确的类型。
func didCancel(overlayView: OverlayView) {
dismiss(animated: true, completion: nil)
}
func didCancel(overlayView: OverlayView) {
navigationController?.popViewController(animated: true)
}
答案 1 :(得分:0)
将这些扩展添加到项目中,您可以使用parentViewController
获取视图的视图控制器。
//
// UIResponder+NextType.swift
//
// Created by Callam Poynter on 02/08/2016.
//
extension UIView {
var parentViewController: UIViewController? {
return next(UIViewController.self)
}
}
extension UIResponder {
func next<T: UIResponder>(_ type: T.Type) -> T? {
switch next {
case let responder as T:
return responder
case let .some(responder):
return responder.next(type)
default:
return nil
}
}
}
如果您在故事板中准备了带有标识符的segue:
parentViewController?.performSegueWithIdentifier("fromPageAToB", sender: nil)
或者,如果您手动实例化控制器,则可以使用以下方式显示控制器:
parentViewController?.presentViewController(pageBController, animated: true, completion: nil)
如果您不想使用这些扩展程序而只是使用您的委托协议,请确保呈现OverlayView
的控制器符合OverlayViewDelegate
并设置委托控制器中的OverlayView
视图为self
。