在处理Container VC时无法让我的委托协议工作?
我无法让我的委托协议工作。我用这个堆栈溢出问题作为指导dispatch event to parent ViewController in swift。我不知道自从这篇文章之后Swift 3中的东西是否发生了变化,但是我的parentViewController函数永远不会被调用。这是我的设置。在处理Container VC时无法让我的委托协议工作?
//PROTOCOL
protocol PDPPropDetailsDelegate {
func buttonPressed(PropDetailsVC: propertyDetailsVC)
}
//子视图控制器
class propertyDetailsVC: UIViewController {
var delegate: PDPPropDetailsDelegate?
@IBAction func emailButton(_ sender: AnyObject) {
self.delegate?.buttonPressed(PropDetailsVC: self)
}
}
的按钮获取调用在儿童视图控制器。
//父视图控制器
class ImageDetailsVC: UIViewController, PDPPropDetailsDelegate {
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "container"{
container = segue.destination as! ContainerViewController
}
}
@IBAction func segmentControlAct(_ sender: Any) {
switch segmentControllerView.selectedIndex {
case 0: print("case 1")
container!.segueIdentifierReceivedFromParent("first")
case 1: print("case 2")
container!.segueIdentifierReceivedFromParent("second")
PropertyDetailsVC.delegate = self // **WHERE I SET DELEGATE**
setUpPropertyDetailsUI(property: filterImages)
default: print("default")
}
}
func buttonPressed(PropDetailsVC: propertyDetailsVC) {
print("BUTTON PRESSED")
}
}
按钮按下永远不会被调用。我认为这与委托没有正确设置有关。不完全确定为什么会是这种情况。我的setUpPropertyDetailsUI(属性:filterImages)从VC中取出Outlets,并设置工作正常。我做了一个断点,并且在分割到PropertyDetailsVC时调用它。任何建议或建议?
import UIKit
open class ContainerViewController: UIViewController {
//Manipulating container views
fileprivate weak var viewController : UIViewController!
//Keeping track of containerViews
fileprivate var containerViewObjects = Dictionary<String,UIViewController>()
/** Specifies which ever container view is on the front */
open var currentViewController : UIViewController{
get {
return self.viewController
}
}
fileprivate var segueIdentifier : String!
/*Identifier For First Container SubView*/
@IBInspectable internal var firstLinkedSubView : String!
override open func viewDidLoad() {
super.viewDidLoad()
}
open override func viewDidAppear(_ animated: Bool) {
if let identifier = firstLinkedSubView{
segueIdentifierReceivedFromParent(identifier)
}
}
override open func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func segueIdentifierReceivedFromParent(_ identifier: String){
self.segueIdentifier = identifier
self.performSegue(withIdentifier: self.segueIdentifier, sender: nil)
}
override open func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == segueIdentifier{
//Remove Container View
if viewController != nil{
viewController.view.removeFromSuperview()
viewController = nil
}
//Add to dictionary if isn't already there
if ((self.containerViewObjects[self.segueIdentifier] == nil)){
viewController = segue.destination
self.containerViewObjects[self.segueIdentifier] = viewController
}else{
for (key, value) in self.containerViewObjects{
if key == self.segueIdentifier{
viewController = value
}
}
}
self.addChildViewController(viewController)
viewController.view.frame = CGRect(x: 0,y: 0, width: self.view.frame.width,height: self.view.frame.height)
self.view.addSubview(viewController.view)
viewController.didMove(toParentViewController: self)
}
}
}
import UIKit
class EmptySegue: UIStoryboardSegue{
override func perform() {
}
/*
// MARK: - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
// Get the new view controller using segue.destinationViewController.
// Pass the selected object to the new view controller.
}
*/
}
您似乎对应用程序的流程有点困惑。下面是我对别人的问题写了一篇关于这同一主题的答案:
https://stackoverflow.com/a/45312362/3832646
你的协议和子视图控制器看起来很大,但也有不妥不少东西与你的代码的其余部分在这里:
您的prepare(for segue:_, sender:_)
通常是您设置目标(子)视图控制器的委托的位置。
PropertyDetailsVC.delegate = self
不会做任何事 - 你需要一个视图控制器的实例来设置它的委托。
它看起来像你正在使用某种容器的全局变量,我不知道它会是什么。
看看我发布的答案,再去一次。它在Swift 3中。
我用一个库来管理我的containerViewControllers 。我将编辑我的问题以反映它。 –
为什么不在你的'emailButton'函数中添加一行来打印我们的委托来查看它是否被设置:'print(self.delegate)' – toddg